2016-06-08 75 views
1

我在C++的第一步中苦苦掙扎。已經問過this的問題,但沒有得到有關名稱空間的完整答案。在Visual C++中使用不同文件和不同名稱空間中的函數

我做了以下事情。

  1. 在Visual Studio 2015年創建時的空項目(New Project - > VISUAL C++ - >空項目)
  2. 然後我Source.cpp和PrintFunc.cpp其相應的內容如下添加兩個文件。

Source.cpp

#include <iostream> 

using namespace std; 

int PrintHello(); 
extern int tempCount; 

void main() 
{ 
    int i; 
    PrintHello(); 
    cout << tempCount << endl; 
    cout << "Hello from main" << endl; 
} 

PrintFunc.cpp

#include <iostream> 

using namespace std; 

int tempCount = 111; 

int PrintHello() 
{ 
    cout << "Hello from Source1" << endl; 
    return 0; 
} 

這是完全編譯。 現在我正在學習命名空間,所以我只是嘗試將第二個文件的內容放在命名空間中,如下所示。

PrintFunc.cpp(修改)

#include <iostream> 

using namespace std; 

namespace MyNameSpace 
{ 
    int tempCount = 111; 

    int PrintHello() 
    { 
     cout << "Hello from Source1" << endl; 
     return 0; 
    } 
} 

現在我修改了Source.cpp也反映在之前的片段的命名空間的介紹。

#include <iostream> 

using namespace std; 

int MyNameSpace::PrintHello(); 
extern int MyNameSpace::tempCount; 

void main() 
{ 
    int i; 
    PrintHello(); 
    cout << tempCount << endl; 
    cout << "Hello from main" << endl; 
} 

這根本就不編譯。有人請善意糾正我。我的目標是在C++中理解命名空間概念。我也有很好的C#。

+1

你從全局命名空間調用它們。試試'MyNameSpace :: PrintHello();''或者你可以使用命名空間MyNameSpace來編寫''但是那麼即使命名空間在第一位也沒用...... – DeiDei

回答

5

的問題編譯器不知道的命名空間MYSpace編譯Source.cpp時。

#include <iostream> 

using namespace std; 

namespace MyNameSpace 
{ 
    int PrintHello(); 
    extern int tempCount; 
} 
int main() 
{ 
    int i; 
    MyNameSpace::PrintHello(); 
    cout << MyNameSpace::tempCount << endl; 
    cout << "Hello from main" << endl; 
} 

但這樣本useless。它的工作原理只是因爲你只有一個消費者.cpp

您應該使用.h文件,然後將它列入(PrintFunc.h)在Source.cpp和任何其他.cpp當你想使用funtions。

我會寫一個例子:

Print.h

#pragma once 

namespace MyNameSpace 
{ 
    int PrintHello(); 
    extern int tempCount; 
} 

請注意,我們dont't使用額外的includesusing namespace這裏。我們將僅使用includes來使用functionsinterfaces中的某些類。 using namespace可能「破壞」消費者的.cpp.h

Print.cpp

#include <iostream> 
#include "Print.h" 

using namespace std; 

int MyNameSpace::tempCount = 111; 

int MyNameSpace::PrintHello() 
{ 
    cout << "Hello from Source1" << endl; 
    return 0; 
} 

在這裏我們可以設置任何include它不會觸及任何其他文件。

和消費者.cpp

#include <iostream> 
#include "Print.h" 

using namespace std; 

int main() 
{ 
    int i; 
    MyNameSpace::PrintHello(); 
    cout << MyNameSpace::tempCount << endl; 
    cout << "Hello from main" << endl; 
} 

VS具體的:#pragma once和VS,你必須#include "stdafx.h"在任何.cpp

+0

嗨德米特里,你的解決方案正在工作。只要給我一些時間,我會作出決定,將其標記爲答案。 – VivekDev

+0

不要着急。只要記住關鍵字'extern'總是應該在'.h'中。 –

3

您在使用其成員時必須提供名稱空間名稱。或使用using namespace指令。

void main() 
{ 
    int i; 
    MyNameSpace::PrintHello(); 
    cout << MyNameSpace::tempCount << endl; 
    cout << "Hello from main" << endl; 
} 

然而,爲它工作的命名空間,應在單獨.h文件中聲明,它應該包含在你的source.cpp

+1

不起作用:「嚴重性\t代碼\t描述\t項目\t文件\t線\t抑制狀態 錯誤\t C2653 \t '了myNameSpace':不是類或命名空間名稱\t CPPConsoleApp \t cppconsoleapp.cpp 「 –

+0

是的,我已經更新了答案。 – Ari0nhh

+0

它不工作,請用完整的代碼更新嗎? – VivekDev

0

所以終於來了第一線。這是我已經解決了基於Dmitriy Zapevalov答案。

首先Print.h

#pragma once 

namespace MyNameSpace 
{ 
    int PrintHello(); 
    extern int tempCount; 
} 

接着PrintFunc.cpp

#include <iostream> 
#include "Print.h" 

using namespace std; 

namespace MyNameSpace 
{ 
    int tempCount = 111; 
    int PrintHello() 
    { 
     cout << "Hello from Source1" << endl; 
     return 0; 
    } 
} 

PrintFunc.cpp也可以像這樣作爲替代。

PrintFunc.cpp(替代)

#include <iostream> 
#include "Print.h" 

using namespace std; 

int MyNameSpace::tempCount = 111; 
int MyNameSpace::PrintHello() 
{ 
    cout << "Hello from Source1" << endl; 
    return 0; 
} 

最後Source.cpp

#include <iostream> 
#include "Print.h" 

using namespace std; 
using namespace MyNameSpace; 

void main() 
{ 
    PrintHello(); 
    cout << tempCount << endl; 
    cout << "Hello from main" << endl; 
} 

Source.cpp也可以像這樣作爲替代。

Source.cpp(二選一)

#include <iostream> 
#include "Print.h" 

using namespace std; 

void main() 
{ 
    MyNameSpace::PrintHello(); 
    cout << MyNameSpace::tempCount << endl; 
    cout << "Hello from main" << endl; 
} 
相關問題