Используя объявления в основном (С++)

Хотя вы не захотите этого делать, если у вас есть компания с пространством имен и класс в этом пространстве имен SOMECLASS. Почему это в файле .cpp, вы можете определить функции как

COMPANY::SOMECLASS::someFunction()
{}

Но в основном я получаю ошибки для выполнения:

int main() {
 COMPANY::SOMECLASS::someFunction();
}

но вместо этого вы объявляете пространство имен и делаете что-то вроде:

using COMPANY::SOMECLASS;
int main() {
 someFunction();
}

Мои ошибки компиляции:

1>c:\documents and settings\wongj\desktop\main.cpp(14) : error C2065: 'saver1' : undeclared identifier
1>c:\documents and settings\wongj\desktop\main.cpp(14) : error C2277: 'JWong::SavingsAccount::{ctor}' : cannot take address of this member function
1>c:\documents and settings\wongj\desktop\main.cpp(14) : error C2061: syntax error : identifier '{ctor}'

SavingsAccount.cpp:

#include "SavingsAccount.h"
// initialize static data member
****** JWong::SavingsAccount::annualInterestRate = 0;
// default constructor, set savingsBalance to 0
JWong::SavingsAccount::SavingsAccount() : savingsBalance(0)
{}
// constructor
JWong::SavingsAccount::SavingsAccount(****** savingsBalance) : savingsBalance(savingsBalance)
{}
****** JWong::SavingsAccount::getSavingsBalance()
{
 return savingsBalance;
}
void JWong::SavingsAccount::setSavingsBalance(****** savingsBalance)
{
 this->savingsBalance = savingsBalance;
}
// added these functions to make program cleaner
****** JWong::SavingsAccount::******************()
{
 return ***************;
}
void JWong::SavingsAccount::******************(****** ***************)
{
 this->*************** = ***************;
}
// returns monthly interest and sets savingsBalance to new amount
****** JWong::SavingsAccount::************************()
{
 ****** *************** = savingsBalance * SavingsAccount::annualInterestRate / 12; 
 setSavingsBalance(savingsBalance + ***************);
 ******************(***************);
 return ***************; 
}
void JWong::SavingsAccount::******************(****** newInterestRate)
{
 SavingsAccount::annualInterestRate = newInterestRate;
}
****** JWong::SavingsAccount::getAnnualInterestRest()
{
 return SavingsAccount::annualInterestRate;
}

SavingsAccount.h

#ifndef JWONG_SAVINGSACCOUNT_H
#define JWONG_SAVINGSACCOUNT_H
namespace JWong
{
 class SavingsAccount
 {
 public: 
 // default constructor
 SavingsAccount();
 // constructor
 SavingsAccount(****** savingsBalance);
 ****** getSavingsBalance();
 void setSavingsBalance(****** savingsBalance);
 ****** ************************();
 ****** ******************();
 void ******************(****** ***************);
 // static functions
 static void ******************(****** newInterestRate);
 static ****** getAnnualInterestRest();
 private:
 ****** savingsBalance;
 // static members
 static ****** annualInterestRate; 
 ****** ***************;
 };
}
#endif

main.cpp:

#include <iostream>
#include <iomanip>
#include "SavingsAccount.h"
using std::cout;
using std::setprecision;
using std::fixed;
//using JWong::SavingsAccount;
int main()
{
 JWong::SavingsAccount::SavingsAccount *saver1 = new JWong::SavingsAccount::SavingsAccount(2000.00);
}
</iomanip></iostream>
4 ответа

Проблема заключается просто в вашей декларации в основном - вы обращаетесь к конструктору, а не к типу, и вы не можете напрямую ссылаться на конструктор.

Измените main на:

int main()
{
 JWong::SavingsAccount *saver1 = new JWong::SavingsAccount(2000.00);
}

... и вам должно быть хорошо идти.


int main() {
 COMPANY::SOMECLASS::someFunction();
}

безусловно, является законным, как и

using COMPANY::SOMECLASS;
int main() {
 someFunction();
}

Последний просто экономит ваше написание. Одна из причин использования первой, однако, заключается в том, чтобы избежать столкновений между несколькими пространствами имен. Например, если когда-нибудь вы решите, что этот код должен использовать библиотеку с классом foo, который объявляет static someFunction():

using COMPANY::SOMECLASS;
using foo;
int main() {
 someFunction(); // Uhh, which someFunction()?
}

См. [27.5] Должен ли я использовать пространство имен std в своем коде? из часто задаваемых вопросов С++.


Директива using может использоваться в исходных файлах С++, а не в заголовочных файлах, поэтому вы можете использовать директиву использования для указанного файла .cpp. Если он не используется, возможно, что тот, кто создал файл, просто решил не делать этого, или, возможно, это было необходимо для того, чтобы избежать столкновения имени (что и является причиной того, что существуют пространства имен). Одно место, которое никогда не следует использовать директиву using, находится в файле заголовка, потому что это полностью подрывает точку с именами в первую очередь (хотя, к сожалению, если вы это сделаете, компилятор ничего не скажет, поскольку это технически допустимо делать).

P.S.: "using директива" я имею в виду директиву, которая находится в глобальной области действия и которая предоставляет содержимое пространства имен. Допустимо иметь директиву using в заголовочном файле, если она приносит символы из другого пространства имен (при условии, что это должно быть частью API), а также для предотвращения затенения функций из базовых очков (т.е. Если вы определили Derived:: foo, вы можете использовать Base:: foo).


namespace COMPANY {
 class SOMECLASS {
 static void someFunction();
 // Here you can call it COMPANY::SOMECLASS::someFunction,
 // SOMECLASS::someFunction, or simply someFunction.
 // You may define it as someFunction.
 };
 // Here you can call it COMPANY::SOMECLASS::someFunction,
 // or SOMECLASS::someFunction.
 // You may define it as COMPANY::SOMECLASS::someFunction or
 // SOMECLASS::someFunction.
}
// Here you must call it COMPANY::SOMECLASS::someFunction,
// You may define it as COMPANY::SOMECLASS::someFunction:
COMPANY::SOMECLASS::someFunction()
{}
// Or call it the same way:
int main() {
 COMPANY::SOMECLASS::someFunction();
}
// If you import the namespace,
using namespace COMPANY;
// or just the class,
using COMPANY::SOMECLASS;
// now you may call it SOMECLASS::someFunction
int main() {
 someFunction(); // ERROR - but you cannot call it simply someFunction
} // outside of the class it lives in.

licensed under cc by-sa 3.0 with attribution.