2016-04-28 8 views
0

4時間未回答の質問を削除しました。私はほとんどの場合、試行錯誤を通して自分自身でそれに答えることができ、1つの部分を除いてその上で良い扱いをしているようです。なぜ私はconstとして地図を宣言しないのですか、それとも間違っていましたか?完全な例は下部にあります。クラスのコンストラクタでマップをconstとして宣言して割り当てることはできません

クラスヘッダーで

const std::map <char, char> UppercaseConvert; 

const UppercaseConvert = { { 'A','a' },{ 'B','b' },{ 'C','c' },{ 'D','d' },{ 'E','e' },{ 'F','f' }, 
        { 'G','g' },{ 'H','h' },{ 'I','i' },{ 'J','j' },{ 'K','k' },{ 'L','l' }, 
        { 'M','m' },{ 'N','n' },{ 'O','o' },{ 'P','p' },{ 'Q','q' },{ 'R','r' }, 
        { 'S','s' },{ 'T','t' },{ 'U','u' },{ 'V','v' },{ 'W','w' },{ 'X','x' }, 
        { 'Y','y' },{ 'Z','z' } }; 

それが世界の終わりではないので、私は宣言と定義の両方からのconstを削除する場合は、コンパイルして動作します。しかし、これは静的でなければならないので、const型を持つべきではありませんか?

これは、それが中で使用されている機能です。

std::string BCLogic::ConvertToLowerCase(FString word) { 
    std::string ConvertedString; 
    for (char character : word) { 
    if (UppercaseConvert[character]) { 
     ConvertedString.push_back(UppercaseConvert[character]); 
    } 
    else ConvertedString.push_back(character); 
    } 
return ConvertedString; 
} 

編集:完全な例あなたはconstのを削除しない限り、コンパイルされません。

#include <iostream> 
#include <string> 
#include <map> 


class Converter { 

public: 
    Converter(); 
    std::string ConvertToLowerCase(std::string); 
    const std::map <char, char> UppercaseConvert; //remove const to compile 


}; 

Converter::Converter() { 
    //remove const to compile 
    const UppercaseConvert = { { 'A','a' },{ 'B','b' },{ 'C','c' },{ 'D','d'},{ 'E','e' },{ 'F','f' }, 
    { 'G','g' },{ 'H','h' },{ 'I','i' },{ 'J','j' },{ 'K','k' },{ 'L','l' }, 
    { 'M','m' },{ 'N','n' },{ 'O','o' },{ 'P','p' },{ 'Q','q' },{ 'R','r' }, 
    { 'S','s' },{ 'T','t' },{ 'U','u' },{ 'V','v' },{ 'W','w' },{ 'X','x' }, 
    { 'Y','y' },{ 'Z','z' } }; 
} 

std::string Converter::ConvertToLowerCase(std::string word) { 

    std::string ConvertedString; 
    for (char character : word) { 
     if (UppercaseConvert[character]) { 
      ConvertedString.push_back(UppercaseConvert[character]); 
     } 
     else ConvertedString.push_back(character); 
    } 
    return ConvertedString; 
} 


int main() { 
    Converter ThisConverter; 

    std::cout << "Enter a word in Caps:"; 
    std::string word; 
    std::getline(std::cin, word); 
    word = ThisConverter.ConvertToLowerCase(word); 
    std::cout << "\n Your converted word is : " << word << std::endl; 
    return 0; 
} 
+0

実際のコードを投稿してください。 'const std:map'は構文エラーです。 'const UppercaseConvert ='も構文エラーです。あなたが行っていることを正確に示さなければ、間違っていることを言うのは難しいです。 [Ask to Ask](http://stackoverflow.com/help/mcve)を参照してください。 –

+0

あなたは無関係の細部で自分を混乱させるでしょう。 [最小完全な例を用意する]もう一つの理由(http://stackoverflow.com/help/mcve)は良い考えです。 – Beta

+0

"これは静的である必要があるため" - 静的にする必要がある場合はなぜ静的にしませんでしたか? –

答えて

1

const UppercaseConvert =は構文エラーです。すでに存在する変数を参照する場合は、その名前をUppercaseConvertとしてください。その宣言や修飾子の一部を繰り返さないでください。


のがラインについてお話しましょう:

UppercaseConvert = { { 'A','a' },{ 'B','b' },{ 'C','c' },{ 'D','d'},{ 'E','e' },{ 'F','f' }, 
{ 'G','g' },{ 'H','h' },{ 'I','i' },{ 'J','j' },{ 'K','k' },{ 'L','l' }, 
{ 'M','m' },{ 'N','n' },{ 'O','o' },{ 'P','p' },{ 'Q','q' },{ 'R','r' }, 
{ 'S','s' },{ 'T','t' },{ 'U','u' },{ 'V','v' },{ 'W','w' },{ 'X','x' }, 
{ 'Y','y' },{ 'Z','z' } }; 

。これは割り当てと呼ばれています。 UppercaseConvertが既に持っている値を別の値に変更しています。

したがって、UppercaseConvertconstにすることはできません。この行もあります。 constの場合、その値を変更することはできません。

あなたが意図したことは、の初期化であると思います。 です。 を初期化するは、変数が作成時に保持する値を指定することを意味します。あなたがこれまでに書いたやり方では、変数は空のマップに初期設定されていて、マップを後で変更してその中にエントリを入れようとします。コンストラクタ本体は、メンバ変数の初期化が完了した後に実行されます。コメントで

Link to further reading about initialization for non-static members

あなたにもマップが静的になりたいらしいです。おそらく良い考えです。 staticメンバーの場合、コンストラクタには何も入れません。これはコンストラクタを使用してクラスのインスタンスを構築するためです。しかし、静的メンバーは特定のインスタンスに関連付けられていません。静的メンバーとは、そのメンバーのインスタンスが合計1つ存在することを意味します。

クラス定義が含まれている必要があります

static const std::map<char, char> UppercaseConvert; 

と、あなたは、このクラスを実装しますが、任意の関数の.cppファイルで、あなたは初期化子で定義を書く(そして、あなたは繰り返さないが単語staticこちら):

const std::map<char, char> BCLogic::UppercaseConvert = 
{ { 'A','a' },{ 'B','b' },{ 'C','c' },{ 'D','d'},{ 'E','e' },{ 'F','f' }, 
{ 'G','g' },{ 'H','h' },{ 'I','i' },{ 'J','j' },{ 'K','k' },{ 'L','l' }, 
{ 'M','m' },{ 'N','n' },{ 'O','o' },{ 'P','p' },{ 'Q','q' },{ 'R','r' }, 
{ 'S','s' },{ 'T','t' },{ 'U','u' },{ 'V','v' },{ 'W','w' },{ 'X','x' }, 
{ 'Y','y' },{ 'Z','z' } }; 

重要な注意:この行はが含まれているにもかかわらずシンボル、それはではなく、の課題です。これは宣言です。代入と宣言の違いは、代入ですでに存在する変数を参照することです。宣言では、型指定子によって示される変数を作成しています。実際には、この行から=を省略することができます(また、そうする必要があります)。しかし、あなたがここに=を使っている人たちを見るように、この点を含めるためにそれを含めました。


コメントに記載されているように、UppercaseConvert[character]も変更する必要があります。 map::operator[]は、非constマップでのみ使用できます。これは、文字がマップに存在していない場合、新しいエントリを追加することです。

ループは次のようになります。

for (char character : word) 
{ 
    auto it = UppercaseConvert.find(character); 
    char ch = it == UppercaseConvert.end() ? character : it->second; 
    ConvertedString.push_back(ch); 
} 

あなたも他の場所でマップのアップを見て計画している場合、独自の機能にその検索コードを分離すると良いでしょう。

+1

静的ではないと思われる場合は、コンストラクタのイニシャライザリストを使用して、クラスごとにコンストラクタで初期化できます。また、[]演算子がconstマップで動作しない場合は、at()関数を呼び出す必要があります。 –

+0

@JerryJeremiah更新、ty –

+0

私はこれを得ていると思う。私が両方の場所でconstを追加したのは、それがクラスで言われたことです(どのクラスでもそれは単純化されているからです)。ですから、私はconstで宣言されたメソッドを持っています: – Wes

関連する問題