2017-03-05 13 views
1

私は、typedefコマンドを使用して配列に異なるライセンスプレートを格納するプログラムを作成することになっています。私の友人は私のコードを渡しましたが、実際に彼の説明を得ていませんでした。これは彼のコードです:Typedef配列の混乱

#include <iostream> 
using namespace std; 

typedef char string[8] 

...functions functions... 

int main(){ 
    string license_plate[100] 

... 

ここで何が起こったのかちょっと混乱しています。私はtypedefが何であるか知っていますが、実際にはそれを配列で見たことはありません。私は

typedef char string[8] 

を理解するものから、私はstring[8]を書くたびコンパイラは、それが代わりにcharになることを意味します。

しかし、それは私には意味がありませんでした。なぜ[8]とタイプするのでしょうか?だから私はこれが彼が残したエラーだと思って、[8]を削除し、エラーなしでコンパイルしました。

私は訂正してstring license_plate[100]がコンパイラの目にchar license_plate[100]以上になると言いたいのですか?もし私がちょうど私がちょうどchar license_plate[100]をタイプすることができたときこれのすべてを使用することによってなぜ自分自身を混乱させるか。

+2

いずれかのドン」を'' namespace std;を使って ''(私がお勧めするもの) ''あなたの型を 'string'と名付けないでください。標準の文字列クラス 'std :: string'があることを忘れないでください。 –

+0

あなたはこのように質問を策定する必要がありますhttp://stackoverflow.com/questions/ask/advice?答えを得る機会を増やすこと。そうでなければ、 'typedef'は既存の型に代替名を与えるために使われます。 –

答えて

3
typedef char string[8] 

に相当します。コンパイラにstringという名前をchar[8]と同等に扱うように指示します。

これについて最も恐ろしいことは、すでに標準std::stringクラスが存在するため、コードとコンパイラの今後の読者を無理なく混乱させるという事実です。

例:この混乱は、あなたがusing namespace std;を使用しているという事実によって、さらにひどい作られ

#include <string> 
#include <iostream> 

int main() 
{ 
    typedef char string[8]; // terrible idea 

    // ... 

    string x("abc"); 
    std::cout << x.size() << '\n'; // error 
    std::cout << (x + "def") << '\n'; // error 
    std::getline(std::cin, x); // error 
} 

。それを使用しないでください。あなた自身の好意を持って、すべてをstd::で前に置いてください。あなたのtypedefについて

別の恐ろしい側面は、あなたがソースコードがstringを呼び出すものとして8つのchar -sized一連の数字を扱いする理由のために想像がつく理由がほとんどないということです。

少なくともそれがchar_arr8のように呼ばれた場合;その場合、typedefという名前は混乱の代わりにコードを読みやすくします(おそらく)。

int main(){ 
    string license_plate[100] 

コードのこの作品は、あなたが本当にが何をしたいのかを示唆しています。文字列のコンテナが必要で、コンテナ "license_plates"を呼び出します。それはいいです。 std::vectorstd::stringを使ってC++で表現してください。

#include <string> 
#include <vector> 

int main() { 
    std::vector<std::string> license_plates; 
    // ... 
} 

あなたは、コンテナは、常に正確に100の要素を保持することが確実な場合は、は、あなたは、配列を使用することができ

#include <string> 

int main() { 
    std::string license_plates[100]; 
    // ... 
} 

またはstd::array

#include <string> 
#include <array> 

int main() { 
    std::array<std::string, 100> license_plates; 
    // ... 
} 
2

char[8]のタイプエイリアスを定義します。たとえば、あなたがそうするとき。

string license_place[100]; 

このコード行はひどいアイデアです

char license_place[100][8];