C++ 问题...定义不能识别声明中指定的向量

Posted

技术标签:

【中文标题】C++ 问题...定义不能识别声明中指定的向量【英文标题】:C++ question... definition doesn't recognize vectors specified in declaration 【发布时间】:2009-05-11 01:23:48 【问题描述】:

我正在做一项从小做起的课堂作业,所以我将所有内容都放在一个文件中。现在它变得更大了,我正在尝试分别编译 main、functions 和 classes(所以所有的类都在一个 .h 和一个 .cpp 中)我有一个类 B,它是很多其他类的父类,并且在文件中排在第一位。由于我正在使用单独的编译,它的一个数据成员现在无法正常工作,这会导致数十个错误。

在.h中

class A;
class B 
public: 
    B ()
    A* myptr;
    void whatever();
    vector<A*> myAs; //this one is the problem
;

在.cpp中

void B::whatever() 
    vector<A*> newvector; //no problem!
    myptr = &something; //no problem!
    for (vector<A*>::iterator iter = myAs.begin(); iter != myAs.end(); ++iter) 
        //error!
    

我收到错误:“myAs 未在此范围内声明”或“B 类没有成员 myAs”。

我已经包含了 ,如您在上面看到的,前向声明的类 A,我绝对记得在 .cpp 的顶部包含 .h!关于向量或类以及我不理解的单独编译是否有一些东西?这是在 Xcode 中,顺便说一句。

【问题讨论】:

标头中声明 myAs 的代码行是否存在错误消息?还是只有一条与使用 myAs 的 CPP 文件中的代码行相关的错误消息? 顺便说一句,我强烈建议您将代码放入析构函数中,以删除 myAs 中 A* 指向的对象,否则会发生内存泄漏。 【参考方案1】:

不仅仅是vector。它是std::vector,因为它位于名为std 的命名空间内。这就是编译器抱怨的原因。它不知道vector&lt;A*&gt; 是什么意思。请改用std::vector&lt;A*&gt;

因此现在将using namespace std; 添加到标题中。如果您愿意,可以将作业放入 .cpp 文件以节省输入。但是将这样一行放入标题中是一个非常糟糕的主意:因为您不知道将来哪些文件需要您的标题。随着包括标题在内的文件数量随着时间的推移而增长,这种情况很快就会失控。因此,标头应仅包含它真正需要的名称和标头,以便尽可能减少名称冲突 - 而 using namespace std; 行将使 std 的所有名称直接可见。

【讨论】:

你发现了我最讨厌的一个(程序员将 using 声明放在头文件中)。 +1。 谢谢!我不敢相信我没有想到这一点,因为我确实意识到我必须将字符串更改为 std::string。我不知道向量也受到同样的影响。

以上是关于C++ 问题...定义不能识别声明中指定的向量的主要内容,如果未能解决你的问题,请参考以下文章

Intellij IDEA 无法识别 Maven 依赖项中指定的类

如何更好地识别 SQL 中指定的开始和结束端点内的表冲突?

c++删除string中指定的字符

OData 错误:URI 中指定的查询无效。该属性不能在查询选项中使用

Android - 自定义样式中指定的边距未生效

为啥在定义为宏值的路径中指定的反斜杠会被删除?有没有办法避免这种情况?