对 C++ 错误的未定义引用
undefined reference to c++ error
嗨,伙计们,我需要你的帮助!
当我编译 运行 时错误是:
/tmp/ccSOgpjn.o: 在函数 Collection::evaluate()':
fitnessTest.cpp:(.text._ZN10Collection8evaluateEv[_ZN10Collection8evaluateEv]+0x45): undefined reference to
fitnessFunction::doEvaluation(std::__cxx11::basic_string, std::allocator >)'
/tmp/ccSOgpjn.o: 在函数 Collection::writeIndividual(char**, int)':
fitnessTest.cpp:(.text._ZN10Collection15writeIndividualEPPci[_ZN10Collection15writeIndividualEPPci]+0x3a): undefined reference to
readIndividual::read[abi:cxx11](char**, int)'
collect2:错误:ld 返回了 1 个退出状态
我不明白为什么?
我的代码是:
class fitnessFunction
{
public:
virtual int doEvaluation(string x);
};
class OneMax: public fitnessFunction
{
public:
virtual int doEvaluation(string x) {
int count = 0;
for (int i = 0; i < x.size(); i++)
if (x[i] == '1') count = count + 1;
return count;
}
};
class readIndividual
{
public:
string read(char * argv[], int i);
};
class OneMaxIndividual: public readIndividual
{
public:
virtual string read(char * argv[], int i) {
string inputFile = argv[i+1];
ifstream input(inputFile.c_str());
string x;
input >> x;
input.close();
return x;
}
};
class Collection
{
public:
fitnessFunction* m_function;
readIndividual* m_individual;
string individual;
public:
Collection(){}
void set_function(fitnessFunction* s){
m_function = s;
}
void set_individual(readIndividual* s){
m_individual = s;
}
int evaluate() {
m_function->doEvaluation(individual);
}
void writeIndividual(char* argv[], int i) {
individual = m_individual->read(argv,i);
}
};
int main(int argc, char* argv[])
{
int result = 0;
string outputFile = "fitness.out";
ofstream output( outputFile.c_str() );
OneMax fitnessFunction;
OneMaxIndividual individualObj;
Collection collection;
collection.set_function(&fitnessFunction);
collection.set_individual(&individualObj);
for(int i = 0; i < argc/2; i++){
//lettura individo
collection.writeIndividual(argv,i);
result = collection.evaluate();
output << result << endl;
}
for(int i = argc/2; i < argc-1; i++){
collection.writeIndividual(argv,i);
result = collection.evaluate();
output << result << endl;
}
output.close();
return 0;
}
我又尝试了几个类似我的问题,但没有找到我已经解决问题的答案。以上代码全部在一页中。
您在 fitnessFunction class 中的 doEvaluation(string ) 函数没有实现。
你有两个选择:
- 通过在末尾附加 =0 使其成为纯虚拟的或
- 创建虚拟实现
我建议将其设为纯虚拟,以便编译器强制您在派生的 classes 中创建实现。
嗨,伙计们,我需要你的帮助! 当我编译 运行 时错误是:
/tmp/ccSOgpjn.o: 在函数 Collection::evaluate()':
fitnessTest.cpp:(.text._ZN10Collection8evaluateEv[_ZN10Collection8evaluateEv]+0x45): undefined reference to
fitnessFunction::doEvaluation(std::__cxx11::basic_string, std::allocator >)'
/tmp/ccSOgpjn.o: 在函数 Collection::writeIndividual(char**, int)':
fitnessTest.cpp:(.text._ZN10Collection15writeIndividualEPPci[_ZN10Collection15writeIndividualEPPci]+0x3a): undefined reference to
readIndividual::read[abi:cxx11](char**, int)'
collect2:错误:ld 返回了 1 个退出状态
我不明白为什么?
我的代码是:
class fitnessFunction
{
public:
virtual int doEvaluation(string x);
};
class OneMax: public fitnessFunction
{
public:
virtual int doEvaluation(string x) {
int count = 0;
for (int i = 0; i < x.size(); i++)
if (x[i] == '1') count = count + 1;
return count;
}
};
class readIndividual
{
public:
string read(char * argv[], int i);
};
class OneMaxIndividual: public readIndividual
{
public:
virtual string read(char * argv[], int i) {
string inputFile = argv[i+1];
ifstream input(inputFile.c_str());
string x;
input >> x;
input.close();
return x;
}
};
class Collection
{
public:
fitnessFunction* m_function;
readIndividual* m_individual;
string individual;
public:
Collection(){}
void set_function(fitnessFunction* s){
m_function = s;
}
void set_individual(readIndividual* s){
m_individual = s;
}
int evaluate() {
m_function->doEvaluation(individual);
}
void writeIndividual(char* argv[], int i) {
individual = m_individual->read(argv,i);
}
};
int main(int argc, char* argv[])
{
int result = 0;
string outputFile = "fitness.out";
ofstream output( outputFile.c_str() );
OneMax fitnessFunction;
OneMaxIndividual individualObj;
Collection collection;
collection.set_function(&fitnessFunction);
collection.set_individual(&individualObj);
for(int i = 0; i < argc/2; i++){
//lettura individo
collection.writeIndividual(argv,i);
result = collection.evaluate();
output << result << endl;
}
for(int i = argc/2; i < argc-1; i++){
collection.writeIndividual(argv,i);
result = collection.evaluate();
output << result << endl;
}
output.close();
return 0;
}
我又尝试了几个类似我的问题,但没有找到我已经解决问题的答案。以上代码全部在一页中。
您在 fitnessFunction class 中的 doEvaluation(string ) 函数没有实现。
你有两个选择: - 通过在末尾附加 =0 使其成为纯虚拟的或 - 创建虚拟实现
我建议将其设为纯虚拟,以便编译器强制您在派生的 classes 中创建实现。