【问题标题】:How to create dynamic objects in member function? [closed]如何在成员函数中创建动态对象? [关闭]
【发布时间】:2015-04-12 03:58:19
【问题描述】:

在Class Championship的成员函数中,我尝试创建动态对象并调用Class Game的成员函数,但收到错误消息error: expected primary-expression before '[' token。如何纠正?

class Championship
{
public:
    Championship(string,int);
    void CreateGame();
    void display();
 private:
    int gamenum;
};
class Game
{
public:
    friend class Championship;
    void Getteam();
};
void Championship::CreateGame()
{   
    Game *game = new Game[gamenum];
    for (int i = 0; i < gamenum; i++)
        Game[i].Getteam();
}

【问题讨论】:

  • 空白和缩进会提高可读性很多
  • 我遗漏了一些东西,比如冠军的定义。 Game 类可能应该在 CreateGame() 之前定义。
  • 即使Game 的前向声明也不会这样做,因为Game *game = new Game[gamenum];Game 必须是完整类型。因此,只需先声明类,然后再实现它们的功能。而且,正如@Jasper 所提到的,Game 必须在Championship 之前声明。
  • Game[i].getteam() 不正确。 Game 是类型而不是变量。
  • game 而不是 Game :最后是一个简单但微妙的错字;-)

标签: c++ dynamic


【解决方案1】:

您在代码中面临的确切问题在于这一点

Game *game = new Game[gamenum];
for (int i = 0; i < gamenum; i++)
    Game[i].Getteam();

这里的主要问题是您声明了一个 Game 类型的数组并将其命名为 game 但随后您尝试使用该类型的 Game 进行访问,因此只需将其交换回 game 即可解决这个问题。

但是,没有必要以这种方式使用原始指针。 std::vector 在很多方面都非常出色。它允许您以安全的方式将越来越多的对象动态添加到容器中。我正要展示如何在您的 Championship::CreateGame() 函数中使用 std::vector ......但我无法真正弄清楚它想要做什么......

我也不明白为什么你的游戏类中有friend 行......这是用来给另一个类“完全”访问你的类的,即Championship 类被授予私有访问权限Game的成员。

【讨论】:

  • 我认为 std::array 实际上在这里会更好
  • @BrandonGomes 也许不太清楚这里的用例是什么。但这并不是当前真正的问题。
【解决方案2】:

编辑:虽然这个答案并不能直接解决问题,但它确实为分配用户定义对象数组提供了一种有用的替代语法。

这可能使用经典的 C 风格双指针数组(即来自 int main(int argc, char** argv) 的 argv)不太优雅地解决。这样的代码将首先为数组分配空间,然后使用带索引的循环为每个单独的对象分配空间。

#include <iostream>

class Foo
{
public:
    //Constructor to ensure each object is unique with an int + loop
    Foo(int k)
    : i(k)
    {}

    int i;

    int operator() () {return i;}
};

int main ()
{ 
    //Arbitrary number for allocation; get this somehow
    int i = 5;

    //Although it can be unsafe, allocate an array of pointers with a pointer to pointer
    Foo** array = new Foo*[i];

    for (int j = 0; j < i; ++j)
    {
        array[j] = new Foo(j);
        //Here, I use operator() to test that each object is unique.
        std::cout << (*array[j])() << std::endl;
    }

    //Using Coliru, the program will work and print out this
    std::cout << "this worked!\n";
    return 0;
}

科利鲁:http://coliru.stacked-crooked.com/a/84f7641e5c4fa2f3

【讨论】:

  • 谢谢。不完全一样,但帮助。将Game[i].Getteam();更改为game[i].Getteam();问题解决了。
  • 其实这个答案很蠢;我没有意识到你没有问这个。
  • 为什么你会建议使用双指针'数组'? std::vector 可以完美地完成这项工作。类型 T 或 std::unique_ptr 不确定到底是哪一个,除非我进一步了解需求。
  • 是的。这些其他方法确实效果更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多