声明并同时初始化一个结构/类数组

3

1.

我知道在声明中可以初始化一个结构体数组,例如:

struct BusStruct
{
    string registration_number;
    string route;
};

struct BusStruct BusDepot[] =
{
    { "ED3280",    "70" },
    { "ED3536",    "73" },
    { "FP6583",    "74A" },
};

如果将结构体改为类,代码如下:
class BusClass
{
protected:
    string m_registration_number;
    string m_route;
public:
    // maybe some public functions to help initialisation
};

对于结构体(即同时声明和初始化一个类数组),是否可以像这样做到相同的效果?

2. 我是否正确地认为,不能同时声明和初始化vector<BusStruct>或者vector<BusClass>


如果你正在处理任何可能可能最终更改的数据,并且这些数据存在于长时间持久化的软件中,那么任何将数据与代码分离的方法都是可取的。文本文件、SqlLite、XmlFiles、Google Protobuffers等都是您可能想要考虑的一些选择。 - Harald Scheirich
3个回答

3

能否像对结构体那样做到相同的事情(即同时声明和初始化类数组)?

除非您创建一个合适的构造函数,否则不可能:

class BusClass
{
protected:
    string m_registration_number;
    string m_route;
public:
    // maybe some public functions to help initialisation
    // Indeed:
    BusClass(string const& registration_number, 
             string const& route)
    :m_registration_number(registration_number),
     m_route(route) { }
};

或者你可以将所有成员设为公共的并省略构造函数,这样你就可以使用与结构体相同的初始化语法。但我认为这不是你想要的。

我是否正确地认为,无法同时声明和初始化vector<BusStruct>vector<BusClass>

在当前的C++中,不可能做到这一点。但是,您可以使用使此操作成为可能的库。我建议使用 Boost.Assign。然而,为此,您的类必须具有构造函数,同样您的结构体也是如此 - 或者您需要创建某种工厂函数。

BusStruct make_bus(string const& registration_number, 
                   string const& route) { ... }

如果您希望在其他情况下使用大括号封闭的初始化列表使结构保持可初始化状态。

感谢您的解释并更新了我的原始帖子(使向量视图后面的位可见)。我并不介意它是公共的还是受保护的,但是您关于boost库的建议很好。我会去看看。 - Andy

1
  1. 不,你不能像结构体一样初始化类。但是你可以在数组声明中编写类构造函数。
  2. C++没有内置的初始化向量的方法,除非你想从已初始化的数组加载向量。

谢谢您的回答。它证实了我的怀疑,现在我需要找到一种初始化它们的方法。 - Andy

0

C++原生支持两种向量初始化的形式,但都不是你想要的。

1:每个元素与以下相同:

vector<int> ints(4,1000); //creates a vector of 4 ints, each value is 1000.

2:从现有向量复制,如下:

vector<int> original(3,1000); //original vector has 3 values, all equal 1000.
vector<int> otherVector(original.begin(),original.end()); //otherVector has 3 values, copied from original vector

你说得对,但不幸的是我不想用相同的起始值初始化所有元素! - Andy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接