【问题标题】:C++ returning an array of objects from a class methodC++ 从类方法返回一个对象数组
【发布时间】:2013-02-16 08:46:48
【问题描述】:

我正在尝试返回“房间”对象的二维数组,作为数组中内容的一种打印/显示。

Room* m_map[10][10];

像这样生成:

//Initialise array to NULL
for(int x=0;x<10;x++)
{
    for(int y=0;y<10;y++)
        m_map[x][y] = NULL;
}

for(int n=0; n<10; n++)
{       
    for(int ran=0; ran<3; ran++)
    {
        int r_n = rand() % 10 ;

        Room* r = new Room(n, "Normal", true, false, false, true);
        m_map[r_n][n] = r;
    }       

}

所以这给出的是数组中房间的分散。

然后我想参考 NULL 为用户显示/打印这些房间所在的位置。

所以我可以例如如果 NULL 显示“#”,如果它是一个房间,请留下一个“”。

我不确定我应该在方法中返回的位。

任何帮助或指出正确的方向将不胜感激

【问题讨论】:

  • 您根本无法从函数返回数组或将数组传递给函数。在这些情况下,数组将降级为指向第一个元素的指针。
  • 不清楚该功能与您提到的此打印/显示有何关系。你能澄清一下吗?另外,这个函数是包含数组的某个类的成员函数吗?
  • 在 C++ 中使用 C 风格的数组有点错过了 C++ 的意义。
  • @juanchopanza 我附加了这个问题以澄清我想要做什么

标签: c++ arrays oop


【解决方案1】:

如果数组是固定大小的(并且大小在编译时已知),则使用std::array&lt;Room, N&gt; 会更容易,如果不是,则使用std::vector&lt;Room&gt; 会更容易。

#include <array> // or <tr1/array> if no C++11

std::array<Room, TheSize> returnArray() const
{
    return m_map;
} 

但请注意,根据用例,您可能想要返回引用,而不是副本:

const std::array<Room, TheSize>& returnArray() const
{
    return m_map;
} 

也就是说,如果您只想打印一些对象,那么不要公开诸如数组之类的实现细节。您可以提供打印功能,或者更好的是,为您的类型覆盖 std::ostream&amp; operator&lt;&lt;

// inside your class declaration:
friend 
std::ostream& operator<<(std::ostream& o, const MyClassWithRooms& r)
{
  // loop over r.m_map and print to o
}

编辑 如果数组是二维的(如 cmets 中提到的)那么有选项:嵌套数组结构(std::array&lt;std::array&lt;T,N&gt;,M&gt;,或“平面”N*M 数组,还有一些小心的玩带索引)。

编辑 2:如果您需要存储可以设置或不设置的内容,您可以使用 std::unique_ptr&lt;Room&gt; 的数组或向量,而不是原始 Room* 的普通旧 Rooms .另一种选择是简单地使用 2D 地图,std::map&lt;int, std::map&lt;int, Room&gt;&gt;

【讨论】:

  • 最好不要暴露它。但是提供一个打印方法。
  • 这是我返回的二维数组,作为 10 x 10 网格......我该如何使用它?对不起,我之前没有说我会编辑这篇文章。
  • @Springfox 同样适用,您可以嵌套结构(数组或数组或向量的向量,或使用平面一维数组,请参阅编辑)。
【解决方案2】:

最简单的方法是为您的阵列使用std::vector&lt; Room &gt;。这样你就不必担心内存管理,并且大小内置在数组中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2018-09-18
    • 1970-01-01
    相关资源
    最近更新 更多