简单的c ++构造函数不起作用(非常基本)

时间:2011-10-10 20:12:43

标签: c++

好的,所以我决定不时地阅读一些c ++,只是为了对语法有一个基本的了解。我熟悉Java,还有一点Python。我已经通过c ++阅读了傻瓜书,我认为自己掌握了 - 直到我试图创建最简单的类。 这个想法是非常简单:一个类(名为ape)接受一个参数,一个int,存储为私有字段。它还有另一个函数,一个返回函数,它返回字段。 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();
}

ape.h

#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)'

的未定义引用

6 个答案:

答案 0 :(得分:3)

没有实际的错误消息,没什么可说的,但至少这是一个问题:

int getNumber()
{
    return number;
}

这应该是int ape::getNumber()。您的代码中也没有tall的定义,或许应该是number

答案 1 :(得分:1)

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

变化:

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的内容。

关于您的上一次修改:

  

我想我应该添加错误消息:undefined reference   到'ape :: ape(int)'

您可能无法与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

答案 2 :(得分:0)

您正在使用未申报的字段“tall”。好像你的构造函数应该是:

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

答案 3 :(得分:0)

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

高? tall来自哪里?该成员被声明为number

最好是

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

好多了

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

答案 4 :(得分:0)

什么高?私有字段在您的示例中称为数字,因此此函数:

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

应该是:

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

但是,在C ++中,您应该使用初始化而不是分配。虽然对于int来说并不是什么大问题,但是对于更复杂的对象,在复制对象时分配更加昂贵,而在初始化时,可以使用复制构造函数。因此,惯例是在构造函数体之前初始化所有变量。

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

并且,请将getNumber()声明为const方法。在这里,您有一个很好的指南解释所有const变体:http://developer.kde.org/~wheeler/cpp-pitfalls.html

当你在它的时候,添加缺少的类前缀,如果你在类的声明之外定义方法,你需要它:

int ape::getNumber() const
{
    return number;
}

作为最后一条评论,我建议你寻找一个关于命名成员变量的约定。典型的是mNumber或_number。稍后可以更轻松地阅读您自己的代码。

答案 5 :(得分:0)

您需要在构造函数中设置变量number,然后才能在getNumber中阅读它。 试试这个:

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