запрос на член, не относящийся к классу

Я часами искал, пытаясь понять, что я делаю не так, и я избавился от большинства своих проблем, но когда я пытаюсь скомпилировать свой код в main(), появляется то же сообщение об ошибке:

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

и он повторяется для всех функций, которые я пытаюсь вызвать в main(). В чем проблема? Я не могу понять, в чем моя ошибка.

Я использую терминал на MacBook для компиляции кода.

Вот моя основная функция:

//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();
}

Вот определения функций-членов для класса:

//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";
}

вот заголовочный файл:

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

person user596228    schedule 31.01.2011    source источник
comment
Я считаю, что ответ требует объявления класса, а также определения.   -  person krousey    schedule 31.01.2011
comment
Я не думаю, что это можно диагностировать без заголовочного файла с определением класса.   -  person Paul Keister    schedule 31.01.2011
comment
Почему вы вводите числа как целые и преобразуете их в двойные? Почему бы не читать их прямо как двойники?   -  person Adam Rosenfield    schedule 31.01.2011


Ответы (2)


строка Program1Math myProgram1Math(); интерпретируется как объявление функции myProgram1Math(), возвращающее Program1Math;

Просто используйте

 Program1Math myProgram1Math;

Используйте () только тогда, когда конструктор принимает параметр (без аргумента по умолчанию).

РЕДАКТИРОВАТЬ: вы должны скомпилировать все исходные файлы (.cpp), из которых состоит ваша программа. Это создаст объектные файлы с тем же именем и другим расширением (в Windows это .obj, для вас - .o).

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

person engf-010    schedule 31.01.2011
comment
действительно самый досадный разбор - person KitsuneYMG; 31.01.2011
comment
когда я это делаю, я получаю следующее сообщение об ошибке: Неопределенные символы: Program1Math :: displaySine1 (), ссылка на которую: _main в ccIvBynB.o Program1Math :: displaySine2 (), ссылка на: _main в ccIvBynB.o Program1Math :: displayTangent1 (), ссылка на: _main в ccIvBynB.o Program1Math :: Program1Math (), ссылка на: _main в ccIvBynB.o ld: символ (ы) не найдены collect2: ld вернул 1 статус выхода - person user596228; 31.01.2011
comment
Это ошибки компоновщика, говорящие о том, что вы не предоставили реализацию для этих функций-членов. - person engf-010; 31.01.2011
comment
но я реализовал в файле Program1Math.cpp, как мне показалось - person user596228; 31.01.2011
comment
Включили ли вы Program1Math.cpp в свою сборку? - person engf-010; 31.01.2011
comment
например, я включил строку #include Program1Math.cpp? - person user596228; 31.01.2011
comment
Можете ли вы отредактировать свой пост и предоставить компилятор, а также способ компиляции и ссылки - person engf-010; 31.01.2011
comment
Я использую терминал для компиляции, и я действительно не знаю, что делаю для связывания. Это первый раз, когда я пробовал писать код для C ++ или Mac. - person user596228; 31.01.2011
comment
отредактировал свой ответ. Это немного помогает? - person engf-010; 31.01.2011
comment
Я так думаю. Я попытаюсь связать их, но меня здесь серьезно затрудняет незнание. - person user596228; 31.01.2011
comment
Каждый программист прошел через эту кривую обучения! Не смущайся. - person engf-010; 31.01.2011
comment
Я думаю, что связываю правильно, но я получаю сообщение Undefined symbols: Program1Math :: Program1Math (), на которое ссылается: _main в ccFM1KZu. O Мне кажется, что с некоторыми частями этого есть что-то принципиально неправильное, но я не могу шагнуть назад достаточно, чтобы увидеть что - person user596228; 31.01.2011
comment
Если вы уверены, что вы связали Program1.o и Program1Math.o, то происходит что-то странное. Моих знаний для этого недостаточно. Может быть, это отдельный вопрос. - person engf-010; 31.01.2011
comment
@ user596228: здесь 4:00 утра. Идти спать. Надеюсь, у тебя все получится. - person engf-010; 31.01.2011
comment
Спасибо! Я попрошу профессора завтра днем, может быть, у него будут какие-нибудь указатели. Я ценю советы и поддержку! - person user596228; 31.01.2011

Вы должны создать экземпляр Program1Math следующим образом:

Program1Math myProgram1Math;

или чтобы разместить объект в куче, используйте ключевое слово new:

Program1Math *myProgram1Math = new Program1Math();
person makes    schedule 31.01.2011
comment
Я не думал, что смогу использовать = new в c ++. Разве это не для Java? - person user596228; 31.01.2011
comment
-1: Это Java-синтаксис. В C ++ «новый» в этом случае неверен. - person Sjoerd; 31.01.2011
comment
@Sjoerd, Действительно, в C ++ new возвращает указатель и выделяет память в куче. Ответ отредактирован для правильности. - person makes; 31.01.2011
comment
@ user596228, new - вполне допустимый оператор в C ++ (не C). Основное отличие от Java со сборкой мусора заключается в том, что вы должны явно освободить выделенную память, используя delete myProgram1Math; где-нибудь позже, иначе вы получите утечку памяти. Вот почему обычно лучше просто объявить локальную переменную, как вы это делаете в своем коде. new обычно требуется только в том случае, если вы хотите, чтобы ваш объект продолжал существовать после возврата из функции (но вы должны где-то сохранить указатель до того, как он это сделает, иначе вы не сможете его использовать или освободить - утечка памяти еще раз). - person Sergei Tachenov; 31.01.2011