簡體   English   中英

如何從另一個.cpp源文件調用main.cpp中定義的方法?

[英]How to call a method defined in main.cpp from another .cpp source file?

首先,這是一個普遍的問題

第二:我想到了這一點,因為現在它在我的項目中使事情變得復雜。 不用擔心我有解決方法,但是我仍然想知道是否還有另一種解決方法。

提出問題:

我有我的main.cpp。 我在其中定義了一些方法和功能。 我還有一些具有其他功能和其他東西的文件,但是現在我需要一個可與main.cpp中定義的臨時變量一起使用的函數。 如何擴展此類變量的范圍,以便也可以在其他文件中使用它?

從課堂上,我知道字段可以是私有的也可以是公共的。 但是這個變量呢? 它是私人的嗎? 上市? 還有什么嗎 我可以為此變量創建一個getter / setter方法嗎? 我什至不能將main.cpp包含在另一個目錄中,因為它將是遞歸的,然后我將main定義為無限次....)

主要問題是:

如何在另一個文件中訪問在main.cpp中定義的變量?

一些示例代碼:

在main.cpp中:

int var = 0;

int getVar() {
    return var;
}


void doVar() {
    // sth happens with var
}

int main() {
    MyObject myObj;

    doVar();
}

在MyObject.cpp中:

class MyObject {
    void DoSth(){
        // NEEDS var from main.cpp, to do sth with it!
        // getVar() doesn't work!
        // doVar() doesn't work either!
    }
}

原諒我這是以前問過的還是真的很愚蠢的問題,但是我剛才真的很想知道

我的解決方法是將doVar和var設置為MyObject的成員(即,現在都在同一文件MyObject.cpp中),但這是唯一的方法嗎?

“是private / public /其他?”

這就是所謂的全局變量 ,它是公開可見的。 任何人都可以提供extern int var;來訪問它extern int var; 聲明。

“我可以為此變量創建一個getter / setter嗎?”

是的,您可以這樣做(請參閱后面的說明)

“我什至不能將main.cpp包含在另一個目錄中,因為它將是遞歸的,然后我將main定義為無限次....)”

當然,您不能這樣做(除了您永遠不想在任何地方包括.cpp文件)。
您需要一些標頭來聲明此接口是在外部實現的,例如

VarInterface.hpp

#ifndef VARINTERFACE_HPP
#define VARINTERFACE_HPP

extern int var; // Optional, just encapsulating it with the functions is the
                // better choice
int getVar();
void doVar();

#endif // VARINTERFACE_HPP

並將其包含在MyObject.cpp的實現中。


至於你的評論

“這會做什么?我只是在Google上搜索並想出了與static類似的東西,對嗎?那有什么區別?”

沒有針對自由功能的privatepublic訪問范圍策略(例如使用C static關鍵字)。

像上面示例中所示的任何函數或全局變量聲明實際上都是可訪問的,除非將其放置在未命名命名空間中 后者實際上限制了鏈接器對它們所在的翻譯單元的訪問:

Another.cpp

namespace {
   // These functions and variables are exclusively accessible within
   // Another.cpp
   int var = 0;
   int getVar();
   void doVar();
}

但是,就上述情況而言,我想從您的問題中了解到相反的情況,因為您想要相反的說法,因此請以上述說明作為補充。


“您可以在其中創建“私有”字段,並以某種方式從該項目中的另一個.cpp訪問它們嗎?”

如果要隱藏int var; 其他翻譯單位的聲明/定義(推薦),您仍然可以像

VarInterface.hpp

#ifndef VARINTERFACE_HPP
#define VARINTERFACE_HPP

int getVar();
void doVar();

#endif // VARINTERFACE_HPP

MyObject.cpp

#include "VarInterface.hpp"

namespace {
   int var = 0;
}

int getVar() {
   return var;
}

void doVar() {
    // sth happens with var
}

main.cpp

#include "VarInterface.hpp"

int main() {
    MyObject myObj;

    doVar();
}

聲明您需要的任何外部變量或函數:

extern int var;
int getVar();
void doVar();

可以在使用它們的源文件中找到,也可以在任何想要使用它們的文件中包含一個標頭。

暫無
暫無

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

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