【问题标题】:access list from class, in parent来自类的访问列表,在父级中
【发布时间】:2011-12-15 19:45:57
【问题描述】:

我是 C++ 新手,并且有使用其他编程语言的经验,但我有一个问题: 如何从子类、父类访问列表?

这是我的布局: TutorialApp.cpp 函数 TutorialApp::update() 在该函数中,我想从另一个类访问列表 mParticles2y 该列表位于:ParticleController.cpp,如下所示:

std::list<int> mParticles2y;

我尝试过访问这样的列表 [在 TutorialApp 中]: mParticleController.mParticles2y.size() [获取它的大小]

但这给了我这个错误:

在没有适当运算符的情况下调用类类型的对象

所以我真的不知道从这里去哪里......

PS:我使用 mParticleController 因为这是我脚本中的状态:

ParticleController mParticleController;

我希望这是足够的信息。

PS:我不确定这是否称为类或子类,我之所以使用这些术语是因为我从 ActionScript 中知道它们[它以类似的方式与类一起使用]

【问题讨论】:

  • 您需要发布您的代码。
  • 好的,这是我的 TutorialApp.cpp 中的代码:pastebin.com/req95dTP 和 ParticleController 中的代码:pastebin.com/7S8t8b8n 请注意,这是使用 Cinder 库编写的
  • @laarsk:为什么有人会检查您的所有代码并为您修复它?发布几行重现您所看到的错误,您可能会在 5 分钟内得到一个好的答案。事实上,大多数人只会掩饰并移动一个。我们是志愿者,您必须提供一些东西来激起我们的好奇心(或我们的虚荣心)才能得到答案。
  • 抱歉,这里有更好的作品:pastebin.com/uCYT07p0

标签: c++ class list parent


【解决方案1】:

有错误的循环代码应该看起来更像这样。它可能无法完全编译,因为我目前无法轻松编译它。这不是解决问题的理想方法,但它对您的代码的影响最小。我会将这个循环移动到 ParticleController 类作为返回 true/false 以指示命中的成员函数。那样封装会更好。

    for(std::list<int>::iterator yit = mParticleController.mParticles2y.begin(), 
       std::list<int>::iterator xit = mParticleController.mParticles2x.begin();
       yit != mParticleController.mParticles2y.end() && xit != mParticleController.mParticles2x.end();
yit++, xit++)
   {
    if(
        (coordy >= *it) && (coordy <= (*it) + 40) &&
        (coordx >= *xit) && (coordx <= (*xit) + 40) 
       )
    {   
       mParticleController.removeTargetedParticles(i); //remove blokje
             score += 1; //score verhogen
    }

}

【讨论】:

  • 我有,只是忘记复制了 :)
  • 我看了你的代码。如果没有 ParticleController 的头文件,就无法准确确定问题所在。 mParticles2y 列表是公开的、受保护的还是私有的?呼叫站点看起来不错。
  • 好的,谢谢!这是来自 ParticleController 的标头代码:pastebin.com/QXaiwiWH
  • 其实就是Particle的header。 :)
  • 问题是你在哪里调用 mParticleController.mParticles2y(i)。如果 mParticles2y 是一个数组或向量,您可以使用 [i] 来获取第 i 个索引处的项目。因为它是一个列表,所以你不能。运算符()是不同的。我建议使用 stl 迭代器遍历列表。查找使用 list.begin()/list.end() 进行迭代的示例。
【解决方案2】:

您提供的信息有些模棱两可,但看起来您可能正试图从另一个类(TutorialApp)访问一个类(ParticleController)的私有状态(列表)。

我假设以下代码结构(请注意,我没有尝试编译它,所以它可能不太正确):

#include <list>

class ParticleController
{
    public:
        ParticleController() {}

        std::list<int> &getParticles2y() const
        {
            return mParticles2y;
        }

    private:
        std::list<int> mParticles2y;
}

class TutorialApp
{
public:
    void update()
    {
        // ...
        ParticleController mParticleController;
        //std::list<int> particles2y = mParticleController.mParticles2y; // error - accessing private member of another class
        std::list<int> &particles2y = mParticleController.getParticles2y(); // OK
    }
}

【讨论】:

  • 哇,谢谢,这几乎完全是我拥有的结构,唯一的事情是:在 ParticleController 中,所有内容都列在 public 下,没有私下...但是你说我应该只做一个函数返回列表,因为那样会更好?听起来是个不错的解决方案__Edit:哦,等等,我看到您实际上只是让公共列表接管私人列表,对吗?
  • 这是错误的,因为它允许修改 const ParticleController 对象,从而调用未定义的行为。 -1来自我。
  • @laarsk:你为什么不能发布这么简单的一段代码,而不是浪费大家的时间?
  • 因为我是 C++ 新手,真的不明白你们在说什么。我不知道如何开始解决 C++ 中的问题,我不知道结构在 C++ 中是如何工作的,我只是想弄清楚这个问题。以官方方式学习东西可能是错误的方式,但它是我现在唯一的方式。我想。至于您的评论:“它将允许修改 const ParticleController 对象”,老实说,我不明白您在说什么。那可能是因为我不是英语,或者是因为我不懂C++的原理,我不知道。
  • 我非常感谢您的帮助。
【解决方案3】:

好的,所以这是在黑暗中拍摄,因为您的问题虽然很罗嗦,但缺少重现问题所需的代码。

您只能访问其他对象的 public 成员(数据或函数)。也就是说,为了访问 mParticleController.mParticles2ymParticles2y 必须是 mParticleController 的任何类型的公共成员

当然,不赞成公开数据成员,这是有充分理由的。一个类应该代表一个抽象,如果你有一个粒子控制器,它应该实现控制粒子所必需的一切,而不是把它的胆量泄露给公众,让每个人都筛选并获取他们需要的东西。

这称为封装,是面向对象范式的基石之一。

【讨论】:

  • 好吧,这听起来合乎逻辑,但奇怪的是:MS Visual C++ 2010 Express 将红色的错误行放在这部分下面:mParticleController,而不是列表......或者这有意义吗?
  • @laarsk:如果您需要比我更好的帮助,您将不得不发布一段重现错误的最少代码。
  • 好的,我现在发布了代码的链接:我的 TutorialApp.cpp 中的代码:pastebin.com/req95dTP 和 ParticleController 中的代码:pastebin.com/7S8t8b8n 请注意,这是使用煤渣图书馆
  • @laarsk:请再次阅读我的最后一条评论。我写了“一段重现错误的最小代码”。我没有写你应该发布大量代码的链接供我们浏览。投入最大的努力。 20 行代码重现了您所询问的问题,我将看看它。但我不会看你所有的代码并为你整理出来。
  • 好吧,对不起,我有点期待。我现在要剪出更好的部分
【解决方案4】:

size是一个方法,需要写size()

【讨论】:

  • 我有,只是忘记复制了 :)
  • 好吧,甚至在我编译它之前,因为 MS C++ Express 显示红线,所以这意味着它不会编译。我不会尝试。
  • 啊,IntelliSense 并不总是可靠的。请进行编译,并确保从 output 窗口中粘贴编译错误,而不是从默认打开的“错误列表”(或任何名称)中粘贴。只有这样我们才能知道编译器到底在抱怨什么。
  • 嗯,那个错误输出对我来说不是很清楚,它输出了很多错误[而脚本在没有发布的 for 循环的情况下工作正常[pastebin.com/uCYT07p0]:pastebin.com/ZSzHFjJ4
  • 应该是这样的:for( i = 0; i
猜你喜欢
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 2013-07-20
相关资源
最近更新 更多