簡體   English   中英

我的函數不知道我的結構值(C ++)

[英]My Function Doesn't Know My Struct Values (c++)

我不熟悉結構,因此如果這是一個愚蠢的問題,請耐心等待。 我有一個頭文件和四個都包含它的.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次,並且由於“乘以定義”而無法運行。 如果將其放在我的三個非主要cpp文件之一中,則該結構似乎無法正常工作,因為其中一些必須在main()中定義。 所以現在它在我的主cpp文件中,但是我有使用這些值的函數,而這些函數在我的非主cpp文件中,據我所知,這些文件在主cpp文件之前就已編譯。 為了解決這個問題,我將struct聲明放在標題中,並將定義放在我的main中(我可能用錯了措辭),然后我說“好吧,運行函數'CheckItTwice'。

//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放置在控制台中則什么也不返回,因為顯然它們尚未被定義為就功能而言。 為什么這樣/您知道如何解決?

在頭文件中定義結構,然后在cpp文件中#include該頭文件。 在標題中嘗試添加

#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文件中刪除結構定義。

為了避免“定義的乘法”錯誤,您需要在頭文件中定義結構,並在頂部放置#pragma once#ifndef...etc塊。 在這里看到這個。

將頭文件包含在您計划在其中使用該結構的任何實現(cpp)文件中。

ToDoLista Soccer, DropOffMax, CookDinner;

聲明結構ToDolista三個實例,分別稱為SoccerDropOffMaxCookDinner 他們不是類型,他們是一個類型實例,該類型是ToDolista

由於您未提供CheckItTwice()的內容, CheckItTwice()我無法對其進行評論,但是請在此處查找有關使用cout的指南。 您可能要考慮將struct作為一個參數傳遞給此方法,最好將其作為const引用。

我使用在網上拼命搜索時看到的東西解決了這個問題:extern。 看來,如果我將聲明放在標頭中,將定義放在cpp中,然后在另一個cpp中再次聲明對象,但在其前加上“ extern”,就可以保持原定義中的值,這就像一個魅力。

標頭

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

};

Side.cpp

ToDoLista Pushups, Tumblr, Laundry, CleanRoom, CleanHouse, Portfolio;

void CheckItTwice(int staytus, string name){
if(staytus==1){//not on the list
    staytus==2;
    cout << "hurry up and" << name << " okay?" << endl;

Main.cpp

extern ToDoLista Pushups, Tumblr, Laundry, CleanRoom, CleanHouse, Portfolio;

Pushups.namit = "Push Ups";
Pushups.status = 1;
Pushups.speed = 0;
Pushups.difficulty = 0;
Pushups.priority = 0;
Pushups.project = "Get Fit";
Pushups.deadline = 20131102;

CheckItTwice(Pushups.status,Pushups.namit);

這對我有用,我希望這個“答案”可以幫助其他人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM