0

私は構造体を作るのが初めてなので、これがばかげた質問であることが判明した場合はご容赦ください。1 つのヘッダー ファイルと 4 つの .cpp ファイルがあり、すべてにそれが含まれています。ToDoLista という構造体があり、文字列 nameIt と int DeadLine があります。それから、Soccer や DropOffMax など、型名がわからないものがあります。

ToDoLista Soccer, DropOffMax, CookDinner;
Soccer.DeadLine=6;
Soccer.nameIt="SOCCER";

//and so on, for a total of six, 3 ints and 3 strings definitions.

この構造体は、移動しようとすると厄介なようです。ヘッダーにある場合、3回含まれており、「複数定義」のために実行されないためです。3 つのメイン以外の cpp ファイルの 1 つに配置すると、構造体の一部を main() で定義する必要があるため、構造体が機能しないようです。今はメインのcppファイルにありますが、これらの値を使用する関数があり、それらの関数はメイン以外のcppファイルにあり、私が知る限り、メインのcppファイルの前にコンパイルされます。それを回避するために、構造体宣言をヘッダーに入れ、定義をメインに入れます (言い方が間違っているかもしれません)。

//MAIN
Soccer.DeadLine=6;
//and so on for all six, like before.

//ok, NOW run the fx.
CheckItTwice(Soccer.Deadline, Soccer.nameIt);

ここでの問題は、CheckItTwice に文字列または int を計算するように指示すると、プログラムはエラーなしで実行されますが、明らかにそれらがまだ定義されていないため、cout があるはずのコンソールに何も返されないことです。機能に関する限り。これはなぜですか / これを回避する方法を知っていますか?

4

3 に答える 3

0

構造体をヘッダーで定義し、#includeそのヘッダーを cpp ファイルで定義します。ヘッダーに追加してみてください

#pragma once

ヘッダーファイルの先頭に。これは Microsoft 固有の拡張機能です -ここに文書化されています

より移植性の高いバージョンを追加することです

#ifndef _SOME_DEF_
#define _SOME_DEF_

struct ToDoLista { 
    string namit;
    string project;
    int status;
    int speed;
    int difficulty;
    int priority;
    int deadline;
}

#endif // _SOME_DEF_

.cpp ファイルから構造体定義を必ず削除してください。

于 2013-11-01T16:09:31.253 に答える
0

「定義された乗算」エラーを回避するには、ヘッダー ファイルで構造体を定義し、先頭に#pragma onceor#ifndef...etcブロックを配置する必要があります。こちらをご覧ください

構造体を使用する予定の実装 (cpp) ファイルにヘッダー ファイルを含めます。

この線

ToDoLista Soccer, DropOffMax, CookDinner;

、、ToDolistaと呼ばれるstruct の 3 つのインスタンスを宣言します。それらはタイプではなく、タイプのインスタンスあり、そのタイプはです。SoccerDropOffMaxCookDinnerToDolista

CheckItTwice()あなたがそれらを提供しなかったので、私は内容についてコメントすることはできませんが、 cout の使用に関するガイダンスについては、こちらをご覧ください。構造体をこのメソッドの 1 つの引数として、できれば const 参照として渡すことを検討してください。

于 2013-11-01T16:18:13.843 に答える