0

假设我有一个类基类的对象:

// baseclass.h
class baseclass
{
    baseclass() # default constructor, constructs baseclass object
}

在基类的 .cpp 中:

// baseclass.cpp
baseclass::baseclass()
{
    // member functions and variables
}

现在我的目标是有一个派生类,并在派生类的默认构造函数中,创建一个静态大小为n 个基类对象的数组。为了尝试澄清,考虑这个问题的另一种方法是将基类视为扑克牌,我想通过调用派生类的默认构造函数来创建这些牌的数组(一副牌)。但是,我决定保留我的问题摘要的范围,因此我将继续使用基础/派生,以便其他人可以更轻松地了解这如何适用于他们。

我不确定以面向对象的方式设置它的最佳方法,到目前为止我有类似的东西,但我遇到了分段错误。这是我的设置方式:

// derivedclass.h (extending baseclass)
class derivedclass
{
    // default constructor for derivedclass object
    derivedclass();

    // a pointer to an object of type baseclass
    baseclass* bar;
    // or should it be:
    baseclass* bar[n] // where n is an integer
    // or is there a better way to do it?
}

最后,因为我说过派生类对象可以有一个数组,所以我必须为派生类的 .cpp 中的默认构造函数做到这一点:

// derivedclass.cpp
derivedclass::derivedclass()
{
    // so I need to initialize the member array
    baseclass* bar = new baseclass[n] // where n is the size I want to initialize 
                                      // the array to
}

那么我列出的任何情况都会导致分段错误吗?创建这个对象数组的最佳方法是什么?抱歉,如果这是一个小问题,我是一名学生,仍在学习很多关于内存分配和指针的知识,通常处理我不必担心的语言。此外,为了他人的利益,我试图保持问题的抽象。提前致谢!

4

3 回答 3

3

我不确定为什么你需要在这里使用动态分配。我宁愿做这样的事情,这也可以节省你在derivedclass构造函数中的一些工作:

struct baseclass
{
    // Stuff...
};

struct derivedclass : baseclass
{
    // Stuff...

    baseclass objects[N];
};

在 C++11 中,您应该使用std::array<>而不是普通的 C 样式数组(std::array<>是 C 样式数组的安全、零开销包装器):

// ...

#include <array>

struct derivedclass : baseclass
{
    // Stuff...

    std::array<baseclass, 10> objects;
};
于 2013-03-28T19:36:49.360 回答
1
// so I need to initialize the member array
baseclass *bar = new baseclass[n];

除此之外,您不初始化成员数组,只初始化与成员变量同名的局部变量,因此它会隐藏它(出于同样的原因,您还会通过丢失指针来泄漏内存到newly分配的数组)。

于 2013-03-28T19:35:54.617 回答
1

Why to use new at all? Why to derive deck from cards? Deck contains cards.

 class Card
 {
     // ... whatever card does
 };

 class Deck
 {
 public:
     static int const CountOfCards = 36;
     typedef std::array<Card,CountOfCards> Cards;
     Cards cards;
     // etc. ... whatever deck does
 };
于 2013-03-28T19:41:22.237 回答