| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2823 人关注过本帖
标题:这个错误如何解决?
只看楼主 加入收藏
hffjhhh
Rank: 1
等 级:新手上路
帖 子:127
专家分:7
注 册:2019-4-10
结帖率:90.38%
收藏
已结贴  问题点数:7 回复次数:11 
这个错误如何解决?
该项目在类的成员函数的实现部分Stock.cpp文件中出现如下错误:
[Error] prototype for 'void Stock::acquire(const string&, long int, double)' does not match any in class 'Stock'
在头文件Stock.h文件中出现如下错:
[Error] candidate is: void Stock::acquire(const char*, int, double)
并显示:
Makefile.win    recipe for target 'Stock.o' failed
Stock.h文件如下:
程序代码:
#ifndef STOCK_H_
#define STOCK_H_
class Stock{
private:
    int shares;
    char company[30];
    double share_val;
    double total_val;
    void set_tot(){ 
        total_val=shares*share_val;
    }
public:
    void acquire(const char * co,int n,double pr);
    void buy(int num,double price);
    void sell(int num,double price);
    void update(double price);
    void show();
};
#endif

Stock.cpp文件如下:
程序代码:
#include<iostream>
#include"Stock.h"
void Stock::acquire(const std::string & co,long n,double pr){
    company=co;
    if(n<0){
        std:cout<<"Number of shares can not be negative;"<<company<<"shares set to 0.\n";
        shares=0;
    }
    else
        shares=n;
    share_val=pr;
    set_tot();
}
void Stock::show(){
    std::cout<<"company:"<<company
    <<"Shares:"<<shares<<'\n'
    <<"share price:$"<<share_val
    <<"total worth:$"<<total_val<<'\n';
}

main.cpp文件如下:
程序代码:
#include <iostream>
#include"Stock.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
    Stock asd;
    asd.acquire("NanoSmart",20,12.50);
    asd.show();
    return 0;
}

搜索更多相关主题的帖子: const 文件 void int double 
2020-12-14 17:17
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53942
注 册:2011-1-18
收藏
得分:7 
acquire(const char * co,int n,double pr)
acquire(const std::string & co,long n,double pr)
是不一样呀!
2020-12-14 19:20
hffjhhh
Rank: 1
等 级:新手上路
帖 子:127
专家分:7
注 册:2019-4-10
收藏
得分:0 
以下是引用rjsp在2020-12-14 19:20:16的发言:

acquire(const char * co,int n,double pr)
acquire(const std::string & co,long n,double pr)
是不一样呀!

如果将Stock.h和Stock.cpp文件中的acquire函数的参数全部改为:
acquire(const std::string & co,int n,double pr)
又出现新的问题如下所示:
[Error] incompatible types in assignment of 'const string {aka const std::basic_string<char>}' to 'char [30]'
如何改正?
2020-12-14 21:22
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53942
注 册:2011-1-18
收藏
得分:0 
主要还是看不懂你想完成什么功能

程序代码:
#ifndef STOCK_H_
#define STOCK_H_

#include <iostream>

class Stock
{
public:
    Stock();
    void acquire( const char* company, unsigned share_count, double share_price );
    double total_worth() const
    {
        return share_count_ * share_price_;
    }
    friend std::ostream& operator<<( std::ostream& os, const Stock& s );

private:
    char company_[30];
    unsigned share_count_;
    double share_price_;
};

#endif


程序代码:
#include "Stock.h"
#include <cstring>

Stock::Stock() : company_(""), share_count_(), share_price_()
{
}

void Stock::acquire( const char* company, unsigned share_count, double share_price )
{
    strncpy( company_, company, sizeof(company_) );
    company_[sizeof(company_)] = '\0';

    share_count_ = share_count;
    share_price_ = share_price;
}

std::ostream& operator<<( std::ostream& os, const Stock& s )
{
    return os << "company: " <<  << '\n'
              << "Share count: " << s.share_count_ << '\n'
              << "share price: " << s.share_price_ << '\n'
              << "total worth: " << s.total_worth();
}


程序代码:
#include "Stock.h"
#include <iostream>

int main(int argc, char** argv)
{
    Stock asd;
    asd.acquire( "NanoSmart", 20, 12.50 );
    std::cout << asd << std::endl;
}
2020-12-15 08:57
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53942
注 册:2011-1-18
收藏
得分:0 
使用 std::string 更简单(以下代码除了改用 std::string 之外,还使用了现代C++的一些语法。当然,你也可以不用她们)

程序代码:
#include <iostream>
#include <string>

class Stock
{
public:
    Stock() noexcept = default;
    void acquire( std::string company, unsigned share_count, double share_price ) noexcept;
    double total_worth() const noexcept
    {
        return share_count_ * share_price_;
    }
    friend std::ostream& operator<<( std::ostream& os, const Stock& s ) noexcept;

private:
    std::string company_ {};
    unsigned share_count_ {};
    double share_price_ {};
};

///////////////////////////////////

void Stock::acquire( std::string company, unsigned share_count, double share_price ) noexcept
{
    company_ = std::move( company );
    share_count_ = share_count;
    share_price_ = share_price;
}

std::ostream& operator<<( std::ostream& os, const Stock& s ) noexcept
{
    return os << "company: " <<  << '\n'
              << "Share count: " << s.share_count_ << '\n'
              << "share price: " << s.share_price_ << '\n'
              << "total worth: " << s.total_worth();
}

///////////////////////////////////

int main( void )
{
    Stock asd;
    asd.acquire( "NanoSmart", 20, 12.50 );
    std::cout << asd << std::endl;
}
2020-12-15 09:04
hffjhhh
Rank: 1
等 级:新手上路
帖 子:127
专家分:7
注 册:2019-4-10
收藏
得分:0 
以下是引用rjsp在2020-12-15 09:04:58的发言:

使用 std::string 更简单(以下代码除了改用 std::string 之外,还使用了现代C++的一些语法。当然,你也可以不用
    company_ = std::move( company );
   

这行一定要添加std::move吗?可不可以去掉?直接:
company_=company;



另外,我的修改如下,不使用现代C++的语法特性,可以编译,但是却没有显示运行结果,为什么会这样?
Stock.h文件如下:
程序代码:
#ifndef STOCK_H_
#define STOCK_H_
class Stock{
private:
    int shares;
    std::string company;
    double share_val;
    double total_val;
    void set_tot(){ 
        total_val=shares*share_val;
    }
public:
    void acquire(std::string co,int n,double pr);
    void buy(int num,double price);
    void sell(int num,double price);
    void update(double price);
    void show();
};
#endif

Stock.cpp文件如下:
程序代码:
#include<iostream>
#include"Stock.h"
void Stock::acquire(std::string co,int n,double pr){
    company=co;
    if(n<0){
        std::cout<<"Number of shares can not be negative;"<<company<<"shares set to 0.\n";
        shares=0;
    }
    else
        shares=n;
    share_val=pr;
    set_tot();
}
void Stock::show(){
    std::cout<<"company:"<<company
    <<"     Shares:"<<shares<<'\n'
    <<"share price:$"<<share_val
    <<"     total worth:$"<<total_val<<'\n';
}

main.cpp文件如下:
程序代码:
#include <iostream>
#include"Stock.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
    Stock asd;
    asd.acquire("NanoSmart",20,12.50);
    asd.show();
    return 0;
}
2020-12-15 13:07
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53942
注 册:2011-1-18
收藏
得分:0 
这行一定要添加std::move吗?可不可以去掉?直接:
company_=company;
可以是可以,但如果这样的话参数最好改为 const std::string& co 或 std::string_view co。当然,即使这样改,在很多情况下效率也不高。

但是却没有显示运行结果
你将运行结果贴出来看看。
2020-12-15 15:01
hffjhhh
Rank: 1
等 级:新手上路
帖 子:127
专家分:7
注 册:2019-4-10
收藏
得分:0 
回复 7楼 rjsp
使用以下代码进行编译运行:
程序代码:
#ifndef STOCK_H_
#define STOCK_H_
class Stock{
private:
    int shares;
    std::string company;
    double share_val;
    double total_val;
    void set_tot(){ 
        total_val=shares*share_val;
    }
public:
    void acquire(std::string co,int n,double pr);
    void buy(int num,double price);
    void sell(int num,double price);
    void update(double price);
    void show();
};
#endif

程序代码:
#include<iostream>
#include"Stock.h"
void Stock::acquire(std::string co,int n,double pr){
    company=co;
    if(n<0){
        std::cout<<"Number of shares can not be negative;"<<company<<"shares set to 0.\n";
        shares=0;
    }
    else
        shares=n;
    share_val=pr;
    set_tot();
}
void Stock::show(){
    std::cout<<"company:"<<company
    <<"     Shares:"<<shares<<'\n'
    <<"share price:$"<<share_val
    <<"     total worth:$"<<total_val<<'\n';
}

程序代码:
#include <iostream>
#include"Stock.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
    Stock asd;
    asd.acquire("NanoSmart",20,12.50);
    asd.show();
    return 0;
}

运行结果为:
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

仅此而已,连黑色的控制台都没有弹出。

[此贴子已经被作者于2020-12-15 15:43编辑过]

2020-12-15 15:39
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9008
专家分:53942
注 册:2011-1-18
收藏
得分:0 
回复 8楼 hffjhhh
你这不是“运行结果”,你的代码都没能“编译链接”成功,没生成exe怎么运行得起来?

编译器给出了链接错误提示“undefined reference to `Stock::acquire(char const*,int,double)`”
你自己查看一下为什么还是 char const*,明明你之前说改成了 std::string co ?
另外,你为什么将 *.o、*.exe 等文件都加入到工程项中了?
2020-12-15 16:50
hffjhhh
Rank: 1
等 级:新手上路
帖 子:127
专家分:7
注 册:2019-4-10
收藏
得分:0 
以下是引用rjsp在2020-12-15 16:50:38的发言:

你这不是“运行结果”,你的代码都没能“编译链接”成功,没生成exe怎么运行得起来?

编译器给出了链接错误提示“undefined reference to `Stock::acquire(char const*,int,double)`”
你自己查看一下为什么还是 char const*,明明你之前说改成了 std::string co ?
另外,你为什么将 *.o、*.exe 等文件都加入到工程项中了?

原来是添加工程文件的时候没有添加到项目中,只是拷贝到目录下,造成编译器链接到的是旧的工程文件所导致的。
2020-12-15 19:07
快速回复:这个错误如何解决?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020210 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved