你能帮我理解为什么在这两个字符串中我得到错误: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();
};
答案 0 :(得分:2)
您在包含文件中有一个循环。编译器不会进行无限递归,因为您添加了#pragma once
选项。
以下是编译器的作用:
#include "myString.h"
。"myString.h"
文件,找到#include "counter.h"
。"counter.h"
文件,找到#include "myString.h"
,但由于#pragma once
而忽略它。"counter.h"
,阅读MyString* m_pStr;
行,不知道MyString
是什么,失败的消息不是很有用。现在,解决方案是在头文件中添加每个其他类的声明。也就是说,在myString.h
后面的includes
的开头添加以下行。
class Counter;
以下一行到counter.h
的开头:
class MyString;
现在,在范围内使用该声明但没有类定义,有些事情你可以做,有些事你做不到:基本上你只能声明指针和引用。该类的任何其他用途都必须转到CPP文件。
你甚至可以摆脱递归includes
!
答案 1 :(得分:2)
为了将来参考其他人,这些是我通常会发现此错误的原因: