好的,所以我决定不时阅读一点c++,只是为了对语法有一个基本的了解。我熟悉Java和Python。我已经通过C++傻瓜书“阅读”了,我以为自己掌握了-直到尝试创建最简单的类为止。
这个想法很简单:一个类(命名为ape)采用一个参数int,该参数存储为私有(private)字段。它还有另一个函数,一个返回函数,该函数返回该字段。 main()创建一个实例,并调用该方法以打印出变量。

这个想法是使用字符串而不是int,但我无法使其正常工作,因此我决定改用int,这显然也不起作用。

如果有兴趣,我可以使用Code::blocks,Windows 7和g++编译器。

这些是类:

Main.cpp

#include <iostream>
#include "ape.h"

using namespace std;

int main()
{
    ape asd(10);
    cout << asd.getNumber();
}


#ifndef APE_H
#define APE_H

class ape
{
    public:
        ape(int num);
        virtual ~ape();
        int getNumber();
    protected:
    private:
        int number;
};

#endif // APE_H

和ape.cpp
#include "ape.h"
using namespace std;

ape::ape(int num)
{
    tall = num;
}

ape::~ape()
{
    //dtor
}

int getNumber()
{
    return number;
}

我收到的错误消息对我来说似乎是非常随机的,因为它们在我所做的每个更改中都在完全更改,并且不是很容易解释。我可以看到自己听起来像个自大的傻瓜,而这整个困惑都是编译器的错误,但是我真的看不到错误消息与代码中的错误之间的任何联系。

第一次来这里,对我好一点。 :)

我想我应该添加错误消息:
未定义对'ape::ape(int)'的引用

最佳答案

您正在为不存在的变量分配值。

更改:

ape::ape(int num)
{
    tall = num;
}

至:
ape::ape(int num) :
  number(num)
{
}

而且,我不知道您为什么编写析构函数,以及为什么决定将其设置为virtual。默认情况下,编译器将生成一个空的析构函数(类似于您的析构函数,但不是virtual)。如果您不打算进行多态性(带有继承和所有“东西”),则可以从代码中删除此析构函数,因为它只会带来复杂性而无济于事。

您还需要在方法定义前面加上类的名称:
int ape::getNumber() // Note the "ape::" here
{
    return number;
}

最后一件事:

您可能还想更改main:
int main()
{
    ape asd(10);
    cout << asd.getNumber() << endl;
}

仅当在缓冲流时输出coutendl时,才会打印flush中放入的内容。

关于您的最后编辑:



您可能无法与ape.o链接。在编译文件夹中,应该具有源文件和每个.o.cpp。您必须将这些对象文件链接在一起以构建程序。此消息表明链接器无法找到ape::ape(int)的定义。也就是说,他可能没有得到ape.o文件。

长话短说,这是您的编译命令的外观(使用g++):
g++ -o main.o -c main.cpp
g++ -o ape.o -c ape.cpp
g++ -o program main.o ape.o

10-04 21:54