использование объявлений в main (C ++) - PullRequest
0 голосов
/ 28 апреля 2010

Хотя вы не захотите этого делать, если у вас есть пространство имен COMPANY и класс в этом пространстве имен 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
double JWong::SavingsAccount::annualInterestRate = 0;

// default constructor, set savingsBalance to 0
JWong::SavingsAccount::SavingsAccount() : savingsBalance(0)
{}

// constructor
JWong::SavingsAccount::SavingsAccount(double savingsBalance) : savingsBalance(savingsBalance)
{}

double JWong::SavingsAccount::getSavingsBalance()
{
    return savingsBalance;
}

void JWong::SavingsAccount::setSavingsBalance(double savingsBalance)
{
    this->savingsBalance = savingsBalance;
}

// added these functions to make program cleaner
double JWong::SavingsAccount::getMonthlyInterest()
{
    return monthlyInterest;
}

void JWong::SavingsAccount::setMonthlyInterest(double monthlyInterest)
{
    this->monthlyInterest = monthlyInterest;
}

// returns monthly interest and sets savingsBalance to new amount
double JWong::SavingsAccount::calculateMonthlyInterest()
{
    double monthlyInterest = savingsBalance * SavingsAccount::annualInterestRate / 12; 
    setSavingsBalance(savingsBalance + monthlyInterest);
    setMonthlyInterest(monthlyInterest);
    return monthlyInterest; 
}

void JWong::SavingsAccount::modifyInterestRate(double newInterestRate)
{
    SavingsAccount::annualInterestRate = newInterestRate;
}

double 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(double savingsBalance);

        double getSavingsBalance();
        void setSavingsBalance(double savingsBalance);
        double calculateMonthlyInterest();
        double getMonthlyInterest();
        void setMonthlyInterest(double monthlyInterest);

        // static functions
        static void modifyInterestRate(double newInterestRate);
        static double getAnnualInterestRest();
    private:
        double savingsBalance;

        // static members
        static double annualInterestRate; 
        double monthlyInterest;
    };
}



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

Ответы [ 4 ]

0 голосов
/ 29 апреля 2010

Проблема просто в вашем объявлении в main - вы обращаетесь к конструктору, а не к типу, и вы не можете напрямую ссылаться на конструктор.

Изменить основной на:

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

... и тебе надо идти.

0 голосов
/ 28 апреля 2010
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? из C ++ FAQ.

0 голосов
/ 28 апреля 2010
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.
0 голосов
/ 28 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...