C ++使用类和字符串编译问题

时间:2016-04-07 14:36:54

标签: c++ string validation class input

我对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;
}

我试过移动&#34;验证val;&#34;围绕主要,在所有功能之外,没有发生任何事情。我也尝试删除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;
}

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

的东西
void validate::set_string(string parameter)
{
 // your code goes here
}