类和字符串的C ++编译问题[重复]

Posted

技术标签:

【中文标题】类和字符串的C ++编译问题[重复]【英文标题】:C++ Compiling issue with class and strings [duplicate] 【发布时间】:2016-04-07 14:36:54 【问题描述】:

我对 c++ 很陌生,我真的不明白这个错误是什么或为什么会发生。除了一些未引用的东西外,我没有收到关于为什么它不编译的有用信息。我已经按照在线教程进行了此操作,并且在执行此操作时遇到了其他人没有的错误?也许我不应该使用我找到的教程,你有吗?

反正错误如下:

main.o -> main.cpp:(.text+0x16e): 未定义引用 'validate::set_string(std::string)' collect2.exe -> [错误] Id 返回 1 个退出状态 Makefile.win -> 目标“Math++.exe”的配方失败

代码如下:

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

string getName();
string name;

class validate 
    public:
        string item;
        void set_string (string);
        bool vInput() 

        
        bool vName() 
            cout << item;
            system("pause");
            return true;
        
;

int main() 
    name = getName();


string getName() 
    validate val;
    cout << "Enter your name: ";
    cin >> name;
    val.set_string(name);
    bool result = val.vName();
    return name;

我已经尝试移动“validate val;”围绕主要,在所有功能之外,并没有发生任何事情。我还尝试删除 vInput 函数,因为它没有返回,但这也没有任何区别。

在告诉我声明函数的评论后,我尝试这样做,但仍然出现编译错误。我这样声明它们,这对于类可能不正确:

bool vName();
bool vInput();
void set_string (string);

人们试图帮助我后的代码:

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

string getName();
string name;

bool vName();
bool vInput();
void set_string (string);

class validate 
    public:
        string item;
        void set_string (string);
        bool vInput() 
            return true;
        
        bool vName() 
            cout << item;
            system("pause");
            return true;
        
;

int main() 
    name = getName();



string getName() 
    validate val;
    cout << "Enter your name: ";
    cin >> name;
    val.set_string(name);
    bool result = val.vName();
    return name;

似乎没有人明白为什么我的 set_string 什么都不做。好吧,它不应该!我正在关注如何执行此操作的示例,但他们不执行任何功能?

// classes example
#include <iostream>
using namespace std;

class Rectangle 
    int width, height;
    public:
        void set_values (int,int);
        int area() return width*height;
 ;

void Rectangle::set_values (int x, int y) 
    width = x;
    height = y;


int main () 
    Rectangle rect;
    rect.set_values (3,4);
    cout << "area: " << rect.area();
    return 0;

【问题讨论】:

您声明了一个函数void set_string(string),但没有定义它。 我没有意识到类中的函数需要定义。并且编译器应该在它到达对它的任何调用之前看到它就在那里? 您在getName() 中有val.set_string(name);。如果没有定义 set_string 函数,编译器会在那里做什么? @JohnnyMopp 我在 getName() 之外声明了这些 @ForceBru 我觉得 OP 以某种方式相信名称 set_string 应该提示编译器需要做什么。这就是我上面的故事。 【参考方案1】:

就编译器而言,不定义您在类中声明的方法的主体并不是错误。这就是允许我们将可能非常复杂的方法体放在不同的源文件中的原因,这通常有利于编写更清晰的代码。但是,如果链接器找不到您调用的方法的主体,它将反对。

在你程序的某个地方,不一定在同一个源文件中,你应该有类似的东西

void validate::set_string(string parameter)

 // your code goes here

【讨论】:

那么我怎样才能让它找到方法的主体呢? 需要更多符合标准的术语才能对此答案进行投票。 @SergeyA 我愿意接受建议。我同意您的评论,但不了解标准的确切措辞。 @Logicrat,我建议从 definitiondeclaration 之间的区别开始,不仅涉及函数,还涉及变量。这可能会证明对您有用! 在您定义主体的程序中,编译器应该可以访问validate 的类定义。如果你把它放在同一个源文件中,那很好,但如果你使用一个单独的源文件,那么validate 的类定义应该在一个.h 文件中,该文件包含在validate 所在的每个源文件中使用(或定义)。【参考方案2】:

您声明了一个名为set_string 的函数,因此编译器现在知道存在一个像这样调用的函数。这意味着如果它遇到对该函数的调用,它就知道它是有效的。问题是,你从来没有定义它。

这是基本逻辑:函数必须做某事,对吗?在这里你甚至没有一个函数,那么编译器应该如何猜测它的作用呢?这就是为什么它不会为它生成目标代码。然后链接器出现并看到缺少​​目标代码并引发错误。

【讨论】:

我理解这个基本逻辑,我知道它的含义。但是,当我都声明了我的函数并且他们有事情要做时,为什么我会收到这个错误。我告诉过你,当我删除 vInput 因为它什么都不返回时,程序仍然坏了。 @Reece,问题出在set_string不是 vInput

以上是关于类和字符串的C ++编译问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章

这个问题,C语言,一个关于头文件重复定义的问题!!!??

C ++的最佳编译器[重复]

C中的字符[重复]

C函数中逗号分隔的返回参数[重复]

当c ++代码正确时,gcc编译错误[重复]

是否有任何情况下有效的 C 代码无法使用 g++ 正确编译 [重复]