带构造函数的C ++类成员

时间:2015-12-17 03:24:46

标签: c++ class oop constructor

这是一个极有可能的极端新手问题,但这是我不太了解的事情。这可能是一个非常简单的东西,但我没有很多c ++的经验,我正在努力学习。

我试图用我想要理解的简化版本来解释它。

我有一个名为Foo的课程。它的构造函数有两个参数。

我有一个名为Bob的类,其中我想要一个Foo的私有实例,但是,我不知道传递给foo构造函数的参数,直到我在Bob的构造函数中。

class Foo
{
public:
    Foo(int a, int b);
    ~Foo();

    int getA();
    int getB();
};

class Bob
{
public:
   Bob();
    ~Bob();

    void DoSomethingHere();
private:
    Foo foo;
};

当我编译代码时,我收到错误。

error: no matching function for call to 'Foo::Foo()'

基于此,我猜它正在尝试自动调用foo的构造函数,但不知道如何。 在Bob类的代码中,我想要做这样的事情。 (bob.cpp)

Bob::Bob() {

    // do stuff to calculate the values of a and b

    int a = 12; int b = 23;

    // Initialize foo with the calculated values
}

鉴于我不知道传递给它的参数,直到我在Bob的代码中,我该如何处理?

4 个答案:

答案 0 :(得分:1)

最新版本的C ++标准C ++ 11和C ++ 14中有各种功能,例如嵌套构造函数,可以在这里使用。但是,有几种替代方法,您应该提供一个更详细的例子来说明您要完成的任务。

我将提供一个使用嵌套构造函数的简单答案。假设Foo的构造函数的两个参数必须来自外部函数first_foo_parameter()和second_foo_parameter():

extern int first_foo_parameter(), second_foo_parameter();

然后,默认构造函数可以这样工作:

class Bob
{
public:
   Bob() : Bob(first_foo_parameter(), second_foo_parameter()) {}

    ~Bob();

    void DoSomethingHere();
private:

    Bob(int a, int b) : foo(a, b) {}

    Foo foo;
};

如果要以更复杂的方式派生私有类成员的构造函数参数,则可以沿着相同的行使用其他不同的技术。有时答案是重构类层次结构,例如首先初始化的私有超类,其构造函数可以自由地进行所有需要的计算,然后在需要构造子类的成员时,所有他们的建设者'参数在完全构造的超类中很容易获得。

答案实际上取决于具体细节。一般方法是使用嵌套构造函数或私有超类来帮助确定所有成员构造函数的参数。

答案 1 :(得分:0)

我认为指针可能就是你想要的。

class Foo
{
public:
    Foo(int a, int b) : a(a), b(b) {}
    ~Foo() {}

    int getA();
    int getB();
private:
    int a;
    int b;
};

int Foo::getA() {
    return a;
}

int Foo::getB() {
    return b;
}

class Bob
{
public:
    Bob();
    ~Bob();

    void DoSomethingHere();
private:
    Foo* foo;  // <--- Here is a pointer to foo.
};

Bob::Bob() {

    // do stuff to calculate the values of a and b

    int a = 12; int b = 23;

    // Initialize foo with the calculated values
    foo = new Foo(a, b);  // <-------- Here we create a new Foo object.
    std::cout << foo->getA();  // <--- Use `->` to reference method or field.
}

Bob::~Bob() {
    delete foo;  // <--- Deallocate the object.
}

在客户端类中,您可以使用默认构造函数创建新的Bob对象。

int main()
{
    Bob bob;
}

答案 2 :(得分:0)

在此处使用某种指针并在计算值后立即创建Foo对象。 std :: unique_ptr在这里很合适。

class Foo
{
public:
    Foo(int a, int b);
    ~Foo();

    int getA();
    int getB();
};

class Bob
{
public:
   Bob();
    ~Bob();

    void DoSomethingHere();
private:
    std::unique_ptr<Foo> foo; // <---- Here
};

并像这样初始化:

Bob::Bob() {

    // do stuff to calculate the values of a and b

    int a = 12; int b = 23;

    // Initialize foo with the calculated values
    foo = std::make_unique<Foo>(a, b); // <---- And here
}

答案 3 :(得分:-1)

将以下内容作为公共函数:

Foo::Foo()

您可以为单个类创建多个构造函数。如果没有给出参数并且它看起来像编译器正在寻找,那么就会调用它。