0

これら 2 つの文字列でエラーが発生する理由を理解していただけますか: 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();
};
4

2 に答える 2

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 ファイルに移動する必要があります。

そして、両方の recursive を取り除くことさえできますincludes!

于 2013-04-14T07:00:40.060 に答える
2

他の人の今後の参考のために、これらは私がこのエラーで通常見つける原因です。

  • 循環インクルード (はい、今回はあなたです)。ヘッダー A は B に依存し、A に依存します。これは、A を最初に含めると、B がその上に含まれることを意味します。B はその上に A を (再び) 含めようとしますが、「pragma once」または包含ガードがこれを防ぎます。その結果、B にはその上に A の定義がありませんが、=> このエラーなしでは機能しません。
  • インクルージョンガードの混乱。新しいヘッダー ファイルを作成すると、多くの人が既存のヘッダー ファイルをコピーして貼り付ける習慣があります。この新しいヘッダー ファイルには、インクルージョン ガードが調整されていない可能性があります。その場合、インクルードがありますが、インクルージョン ガードは新しいヘッダー ファイルまたは古いヘッダー ファイルのどちらか先にある方のみを許可します。最終的に、新しいヘッダーを含む一部のファイルでは機能せず、クラスが未定義になります。長い間続く可能性があります。この状態が何年も検出されずに存在するコード ベースを見てきました。「pragma once」ユーザーは対象外です。
  • 実際にクラスを書き忘れたり、使用中のタイプミスや定義/大文字と小文字が異なります。明らかな問題、明白な解決策。
于 2013-04-14T07:24:29.663 に答える