0

你能帮我理解为什么在这两个字符串中我得到错误:1)C2143:语法错误:缺少';' 在“*”之前 2) 错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持默认整数。

MyString* m_pStr; // Link to a dynamically created string.
MyString* pPrev; // Pointer to the next counter.

我的字符串.h

#pragma once
#include <iostream>
#include "counter.h"

using namespace std;
class MyString
{
    char* m_pStr;   //String which is a member of the class.
    void CreateArray(const char * pStr);
    Counter* m_pMyCounter; // Pointer to its own counter. 

    public:
        MyString(const char* pStr = "");
        MyString(const MyString & other);
        MyString(MyString && other);
        ~MyString();

        const char * GetString();
        void SetNewString(char * str);

        void printAllStrings(); 
        void ChangeCase();
        void printAlphabetically();
};

我的字符串.cpp

#include "myString.h"
#include <iostream>
using namespace std;


MyString::MyString(const char* pStr){   
    this->CreateArray(pStr);
    strcpy(m_pStr, pStr);   
};
void MyString:: CreateArray(const char * pStr){
    int size_of_string = strlen(pStr)+1;    
    m_pStr = new char[size_of_string];  
}

MyString::MyString(const MyString & other){
    this->CreateArray(other.m_pStr);
    strcpy(m_pStr, other.m_pStr);
}

MyString::MyString(MyString && other){
    this->m_pStr = other.m_pStr;
    other.m_pStr = nullptr; 
}

MyString::~MyString(){
    delete[] m_pStr;
}

const char * MyString:: GetString(){
    return m_pStr;
}

void MyString:: SetNewString(char * str){
    this->CreateArray(str);
    strcpy(m_pStr, str);
}

计数器.h

#pragma once
#include "myString.h"
#include <iostream>
using namespace std;

class Counter{
    private:
        MyString* m_pStr; // Link to a dynamically created string.
        int m_nOwners; // Counter of users of this string.
        MyString* pPrev; // Pointer to the next counter.
    public:
        Counter(); 
        //Copy constructor.
        ~Counter();
        void AddUser();
        void RemoveUser();
};
4

2 回答 2

2

供其他人将来参考,这些是我通常会发现此错误的原因:

  • 循环包括(是的,这次就是你)。标头 A 依赖 B 依赖 A。这意味着当您首先包含 A 时,B 会包含在其上方。B 尝试将 A 包含在它之上(再次),但“pragma once”或包含保护阻止了这一点。结果是 B 上面没有 A 的定义,但如果没有 => 这个错误,它将无法工作。
  • 包含警卫混乱。您创建新的头文件,许多人有复制/粘贴现有​​头文件的习惯。这个新的头文件可能忘记调整它的包含保护。如果发生这种情况,会有一个包含,但包含保护只会让新的或旧的头文件进入,以先到者为准。最终结果是,在某些包含新标头的文件中,它将不起作用,并且该类将未定义。可能会徘徊很长时间,我已经看到存在这种情况多年未被发现的代码库。不符合“pragma once”用户的条件。
  • 实际上忘记写使用中的类/错别字或定义/大小写不同。明显的问题,明显的解决方案。
于 2013-04-14T07:24:29.663 回答
2

您在包含文件中有一个循环。编译器不会执行无限递归,因为您添加了该#pragma once选项。

下面是编译器的作用:

  1. 阅读 CPP 文件。找到#include "myString.h".
  2. 阅读"myString.h"文件,找到#include "counter.h".
  3. 读取"counter.h"文件,找到#include "myString.h",但由于#pragma once.
  4. 继续"counter.h",阅读该MyString* m_pStr;行,不知道是什么MyString,失败并显示无用的消息。

现在,解决方案是在头文件中添加每个其他类的声明。也就是说,将以下行添加到 的开头myString.h,就在 . 之后includes

class Counter;

以下行开头counter.h

class MyString;

现在,有了作用域中的声明但没有类定义,有些事情可以做,有些事情不能做:基本上你只能声明指针和引用。该类的任何其他用途都必须转到 CPP 文件。

你甚至可以摆脱这两个递归includes

于 2013-04-14T07:00:40.060 回答