我的函数不知道我的结构值(c ++)

时间:2013-11-01 16:07:17

标签: c++ visual-studio-2010 function struct undefined

我不熟悉结构,所以如果这是一个愚蠢的问题,请耐心等待。我有一个头文件和四个.cpp文件都包含它。我有一个名为ToDoLista的结构,它有字符串nameIt和int DeadLine。然后我有类型名称我不知道的东西,如足球和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.

如果我尝试移动它,这个结构看起来很好看,因为如果它在标题中它被包含三次并且由于“多次定义”而无法运行。如果我把它放在我的三个非主要cpp文件之一中,似乎结构将不起作用,因为其中一些必须在main()中定义。所以现在它在我的主cpp文件中,但我有使用这些值的函数,这些函数在我的非主cpp文件中,据我所知在主文件之前编译。为了解决这个问题,我将结构声明放在标题中,并在我的主要内容中定义(我可能有错误的说法)然后我说'好吧,运行'CheckItTwice'函数。

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

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

这里的问题是,如果我告诉CheckItTwice说,cout字符串或int,它运行程序没有错误,但在cout应该在控制台中什么都不返回,因为显然他们还没有被定义然而,就功能而言。为什么这个/你知道解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

在标题中定义结构,并在cpp文件中定义#include标题。在标题中尝试添加

#pragma once

位于头文件的顶部。这是Microsoft特定的扩展 - 记录为here

更便携的版本是添加

#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文件中删除struct定义。

答案 1 :(得分:0)

为了避免"定义的乘法"您需要在头文件中定义结构的错误,并在顶部放置#pragma once#ifndef...etc块。见this here.

将头文件包含在您计划使用结构的任何实现(cpp)文件中。

该行

ToDoLista Soccer, DropOffMax, CookDinner;

声明结构ToDolista的三个实例,称为SoccerDropOffMaxCookDinner。它们是不是类型,它们是 类型的实例,类型为ToDolista

我无法评论CheckItTwice()的内容,因为您没有提供,但look here有关使用cout的指导。您可能需要考虑将结构作为一个参数传递给此方法,最好是作为const引用。

答案 2 :(得分:0)

我使用我在拼命搜索时看到的东西解决了这个问题:extern。似乎如果我把声明放在标题中,cpp中的定义,然后在另一个cpp中再次声明对象,但在它之前使用'extern',就像保留原始定义中的值一样,它就像魅力一样

Header.h

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);

这对我有用,我希望这个'回答'可以帮助别人。