在cpp中创建嵌套对象。下面的伪代码中的函数调用序列是什么?

时间:2015-04-03 09:26:42

标签: c++

这是一些代码,我不理解某些概念。请帮忙!

现在在下面的代码中,当我创建some_obj1并尝试访问some_obj2中的表时,我能够访问internal_table吗?是创造了吗?

我觉得它不会,因为我在some_obj1的默认构造函数中什么都不做,我也没有在some_obj2的默认构造函数中创建它。

class some_obj1 {
 public: // Updated
    some_obj2 table; // table is a vector of int pointers.

    some_obj1() {
        //DO Nothing
    }
}

class some_obj2 {
 public: // Updated
    std::vector<int *> internal_table;

    some_obj2(){
        internal_table.push(new int[10]);
    }
}

main () {
    some_obj1 make_a_object;
    //Use the object created for some task.
    // Access the internal_table in some_obj2. Will I be able to access it? is it created?

}

3 个答案:

答案 0 :(得分:0)

在构造函数的左括号中,所有成员都已构造 - 默认构造(如果它们具有默认构造函数)或未初始化(如果它们是普通旧数据(POD)类别,如int或指针)。

请注意,如果您没有声明类和结构,您将自动获得类和结构的默认构造函数。这个使用它们的默认构造函数正确地构造你的类类型成员。

如果您不想默认构造某些东西(或者如果您不能 - 因为它可能没有默认构造函数),您应该在初始化列表中初始化它。

答案 1 :(得分:0)

你有这里使用的简单的构图规则。

当你这么做时,第一件事就是创造出来:

some_obj1 make_a_object;

创建事物的顺序:

std::vector<int *> internal_table; //because some_obj2 will needs it
some_obj2 table; //because some_obj1 needs it
some_obj1 make_a_object; //is now finally ready

如果使用调试器,则很容易检测到。 3行只描绘了对象在那里完成的顺序创建它没有显示执行顺序,因为当然首先执行some_obj1 make_a_object。关键是这段代码首先触发其他事物的创建,当完成后,对some_obj1 make_a_object的调用将完成。

此代码也值得怀疑:

internal_table.push_back(new int[10]);

我认为只有一个元素,数组中的第一个元素将被推送到向量上。

答案 2 :(得分:0)

是的,你可以做你想做的事,但你需要修复语法和其他问题,比如

1)不声明构造函数的访问说明符将导致它被声明为private,这将不允许创建其对象,这是单例设计模式的基础。

2)STL中没有为push提供push_back这样的方法。

3)类定义应以;

结尾

4)您将收到一个错误,没有类型some_obj2来解决此问题,您应该进行前向声明或遵循序列。

#include <iostream>
#include <vector>

using namespace std;

class some_obj2 {
   std::vector<int *> internal_table;

   public:
   some_obj2(){
      internal_table.push_back(new int[10]);
   }
};


class some_obj1 {
   some_obj2 table; // table is a vector of int pointers.

   public:
   some_obj1() {
      //DO Nothing
   }
};
int main () {
    some_obj1 make_a_object;
    //Use the object created for some task.
    // Access the internal_table in some_obj2. Will I be able to access it? is it created?
return 0;
}