为什么我的课程无法访问,而我已经包含了头文件

时间:2013-04-14 06:33:00

标签: c++

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

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

MyString.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();
};

MyString.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);
}

counter.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();
};

2 个答案:

答案 0 :(得分: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是什么,失败的消息不是很有用。
  5. 现在,解决方案是在头文件中添加每个其他类的声明。也就是说,在myString.h后面的includes的开头添加以下行。

    class Counter;
    

    以下一行到counter.h的开头:

    class MyString;
    

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

    你甚至可以摆脱递归includes

答案 1 :(得分:2)

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

  • 循环包括(是的,这次是你)。标题A取决于B取决于A.这意味着当您首先包含A时,B包含在其上方。 B试图在它上面包括A(再次),但是“pragma once”或包含守卫阻止了这一点。结果是B上面没有A的定义,但没有=&gt;这个错误。
  • 包容性卫冕。您创建新的头文件,许多人有习惯复制/粘贴现有​​的头文件。这个新的头文件可能会忘记调整其包含保护。如果发生这种情况,则会有一个包含但包含警卫只会让新的或旧的头文件进入,以先到者为准。最终的结果是,在包含新标题的某些文件中,它将无法正常工作,并且该类将是未定义的。可能会徘徊很长一段时间,我已经看到了这种情况存在多年未被发现的代码库。不符合“pragma once”用户的条件。
  • 实际上忘了写使用中的类/拼写错误或定义/大写不同。明显的问题,明显的解决方案。