2011-01-31 10 views
15

Sono stato a caccia intorno per ore cercando di capire cosa sto facendo di sbagliato, e io 'ho deciso di eliminare la maggior parte dei miei problemi, ma quando provo a compilare il mio codice in main() si tratta con lo stesso messaggio di errore:richiesta per membro "..." in "..." che è di tipo non di classe "..."

request for member "..." in "..." which is of non-class type "..." 

e si ripete per tutte le funzioni provo a chiamare main() . Qual è il problema? Non riesco a capire dove sia il mio errore.

Sto usando Terminale su un macbook per compilare il codice.

Qui è la mia funzione principale:

//Program1.cpp 
//Program1Math test function 
#include "Program1Math.h" 

int main() 
{ 
    //Create a Program1Math object 
    Program1Math myProgram1Math(); 

    myProgram1Math.setNumber1(); 
    myProgram1Math.setNumber2(); 

    myProgram1Math.displayMultiple(); 
    myProgram1Math.displaySine1(); 
    myProgram1Math.displayTangent1(); 
    myProgram1Math.displaySine2(); 
    myProgram1Math.displayTangent2(); 
} 

Qui ci sono le definizioni di membro-funzione per la classe:

//Program1Math.cpp 
//Program1Math member-function definitions. 
#include <iostream> 
#include <cmath> 
#include "Program1Math.h" 
using namespace std; 

//constructor makes a Program1Math, adds an blank line 
Program1Math::Program1Math() 
{ 
    cout << "/n"; 
} 

//function to assign the first integer to its appropriate location 
void Program1Math::setNumber1() 
{ 
    cout << "Please enter the first integer number /n"; 
    int numberSpot; 
    cin >>numberSpot; 
    static_cast<double>(numberSpot); 
    number1 = numberSpot; 
} 

//function to assign the second integer to its appropriate location 
void Program1Math::setNumber2() 
{ 
    cout << "Please enter the second integer number /n"; 
    int numberSpot; 
    cin >>numberSpot; 
    static_cast<double>(numberSpot); 
    number2 = numberSpot; 
} 

//function to find the sine value for a specified number 
void Program1Math::calculateSine(double inputNumber) 
{ 
    sineValue = sin(inputNumber); 
} 

//function to find the tangent value for a specified number 
void Program1Math::calculateTangent(double inputNumber) 
{ 
    tangentValue = tan(inputNumber); 
} 

//function to determine if the user-inputted numbers are multiples of each other 
void Program1Math::calculateModulus() 
{ 
    int number1Int = static_cast<int>(number1); 
    int number2Int = static_cast<int>(number2); 
    int modulusValue = number1Int % number2Int; 
    if (modulusValue == 0) 
    multiple = true; 
    else 
    multiple = false; 
} 

//function to display the whether the numbers are multiples or not 
void Program1Math::displayMultiple() 
{ 
    if(multiple == true) 
    cout<< number1 << " is a multiple of " << number2 << "!/n"; 
    else 
    cout<< number1 << "is not a multiple of " << number2 << "./n"; 
} 

//function to display the sine value of the first number 
void Program1Math::displaySine1() 
{ 
    calculateSine(number1); 
    cout << "Sine(" << number1 << ") = " << sineValue << "/n"; 
} 

//function to display the sine value of the second number 
void Program1Math::displaySine2() 
{ 
    calculateSine(number2); 
    cout << "Sine(" << number2 << ") = " << sineValue << "/n"; 
} 

//function to display the tangent value of the first number 
void Program1Math::displayTangent1() 
{ 
    calculateTangent(number1); 
    cout << "Tan(" << number1 << ") = " << tangentValue << "/n"; 
} 

//function to display the tangent value of the second number 
void Program1Math::displayTangent2() 
{ 
    calculateTangent(number2); 
    cout << "Tan(" << number2 << ") = " << tangentValue << "/n"; 
} 

Ecco il file di intestazione:

#include <cmath> 
using namespace std; 

class Program1Math 
{ 
public: 
    Program1Math(); 
    void setNumber1(); 
    void setNumber2(); 
    void calculateSine(double); 
    void calculateTangent(double); 
    void calculateModulus(); 
    void displayMultiple(); 
    void displaySine1(); 
    void displaySine2(); 
    void displayTangent1(); 
    void displayTangent2(); 
private: 
    double number1; 
    double number2; 
    double sineValue; 
    double tangentValue; 
    bool multiple; 
}; 
+0

Credo che la risposta richieda la dichiarazione della classe e la definizione. –

+0

Non mi importa che questo possa essere diagnosticato senza il file di intestazione con la definizione della classe. –

+0

Perché stai inserendo i tuoi numeri come inte e convertendoli in duplicati? Perché non leggerli direttamente come doppi? –

risposta

0

Si dovrebbe creare l'istanza Program1Math in questo modo:

Program1Math myProgram1Math; 

o per allocare l'oggetto sul mucchio, utilizzare la parola chiave new:

Program1Math *myProgram1Math = new Program1Math(); 
+0

Non pensavo di poter usare "= new" in C++. Non è quello per Java? – user596228

+1

-1: questa è la sintassi Java. In C++ il "nuovo" non è corretto in questo caso. – Sjoerd

+0

@Sjoerd, infatti, in C++ new restituisce un puntatore e alloca la memoria sull'heap. Risposta modificata per correttezza. – mizo

17

linea Program1Math myProgram1Math(); viene interpretato come una dichiarazione di funzione myProgram1Math() ritorno Program1Math;

Basta usare

Program1Math myProgram1Math; 

utilizzare solo() quando un costruttore accetta un parametro (senza un argomento di default).

MODIFICA: è necessario compilare tutti i file di origine (.cpp) che compongono il programma. Questo produrrà file oggetto con lo stesso nome con un'estensione diversa (su Windows questo è .obj, per te è .o).

Dopodiché tutti i file .o devono essere collegati con alcune librerie fornite dal compilatore per rendere il programma eseguibile.

+0

parse più fastidioso anzi – KitsuneYMG

+0

quando faccio che ottengo questo messaggio di errore: i simboli non definiti: "Program1Math :: displaySine1()", si fa riferimento da: _main in ccIvBynB.o "Program1Math :: displaySine2()", si fa riferimento da : _main in ccIvBynB.o "Program1Math :: displayTangent1()", fa riferimento a: _main in ccIvBynB.o "Program1Math :: Program1Math()", fa riferimento a: _main in ccIvBynB.o ld: simbolo (s) non trovato collect2: ld restituito 1 stato di uscita – user596228

+0

Questi sono errori di linker che ti dicono che non hai fornito un'implementazione per quelle funzioni membro –

Problemi correlati