【问题标题】:My Function Doesn't Know My Struct Values (c++)我的函数不知道我的结构值 (c++)
【发布时间】:2013-11-01 16:07:17
【问题描述】:

我是新手,如果这是一个愚蠢的问题,请多多包涵。我有一个头文件和四个包含它的 .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 文件中,据我所知,这些文件在主文件之前编译。为了解决这个问题,我将 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 说,cout 字符串或 int,它会运行程序而不会出错,但不会在 cout 应该在的控制台中返回任何内容,因为显然它们还没有被定义然而,就功能而言。为什么会这样/你知道解决这个问题的方法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    线

    ToDoLista Soccer, DropOffMax, CookDinner;
    

    声明结构ToDolista 的三个实例,分别称为SoccerDropOffMaxCookDinner。它们是类型,它们是一种类型的实例,该类型是ToDolista

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

    【讨论】:

    • 我可以很好地使用 cout,并且证明问题特别是定义本身,是 CheckItTwice 对cout << "it's " << Soccer.Deadline << "so hurry up" << endl; 说,它在控制台中显示为“它太快了”。所以问题出在变量本身。
    【解决方案2】:

    在您的标头中定义结构,并在 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 文件中删除结构定义。

    【讨论】:

    • 不。没有改变。所有东西下面都有红线,所以看起来它不会编译(但它确实),这是唯一的区别
    • #ifndef LETSDOTHIS #define LETSDOTHIS struct ToDoLista{ string namit; string project; int status; int speed; int difficulty; int priority; int deadline; #endif } Pushups, ClipNails, Shampoo, Soccer, Pocket, DropOffMax, Laundry, HomeSchool, Portfolio; 这不起作用,它说它们已经在我的主文件中定义了。我做错了吗?哦等一下,我需要移动支架...
    • 不,它从 59 个错误(主要是多重定义的错误)变为 58 个。:(
    • 错误 53 错误 LNK2005: "struct ToDoLista Shampoo" (?Shampoo@@3UToDoLista@@A) 已在 Dyno 1.1.obj C:\Users\Admin\Documents\Visual Studio 2010\Projects\ 中定义Dyno 1.0\Dyno 1.0\ToDo.obj
    【解决方案3】:

    我用我在网上拼命搜索时看到的东西解决了这个问题:extern。似乎如果我将声明放在标头中,将定义放在 cpp 中,然后在另一个 cpp 中再次声明该对象,但在它之前使用“extern”,就保持原始定义中的值而言,它就像一个魅力.

    头文件.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);
    

    这对我有用,我希望这个“答案”对其他人有所帮助。

    【讨论】:

    • 您的回答至少澄清了您的问题,即您希望全局变量在多个实现文件中可见。答案是——不要使用全局变量!!您现在使用的是 c++,所以如果您必须拥有某种“全局变量”,那么请使用单例模式。
    猜你喜欢
    • 2016-02-25
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多