0

我是做结构的新手,所以如果这是一个愚蠢的问题,请多多包涵。我有一个头文件和四个包含它的 .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.

如果我尝试移动它,这个结构似乎很奇怪,因为如果它在标题中,它会被包含三次,并且由于“多重定义”而不会运行。如果我将它放在我的三个非主 cpp 文件之一中,那么该结构似乎无法工作,因为其中一些必须在 main() 中定义。所以现在它在我的主 cpp 文件中,但我有使用这些值的函数,这些函数在我的非主 cpp 文件中,据我所知,这些文件在主文件之前编译。为了解决这个问题,我将结构声明放在标题中,并将定义放在我的 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 说,cout 字符串或 int,它会运行程序而不会出错,但不会在 cout 应该在的控制台中返回任何内容,因为显然它们还没有被定义,因为就功能而言。为什么会这样/你知道解决这个问题的方法吗?

4

3 回答 3

0

为了避免“定义乘法”错误,您需要在头文件中定义结构,并在顶部放置一个#pragma once或块。#ifndef...etc在这里看到这个。

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

线

ToDoLista Soccer, DropOffMax, CookDinner;

声明 struct 的三个实例ToDolista,称为SoccerDropOffMaxCookDinner. 它们不是类型,它们是类型的实例该类型是ToDolista.

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

于 2013-11-01T16:18:13.843 回答
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

I got this issue resolved using something I saw while searching desperately online: extern. it seems that if I put the declaraction in the header, the definition in a cpp, and then declare the object again in another cpp but with 'extern' before it, it works like a charm as far as keeping the values from the original definition.

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

This works for me, and I hope this 'answer' helps someone else.

于 2013-11-02T18:21:15.110 回答