2016-04-27 4 views
0

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

Ошибка 1 Ошибка C2597: нелегальная ссылка на нестатический член «circleType :: радиус»

У меня есть 2 файлов заголовки, circleType.h и cylinderType.h и Мне нужно предоставить результаты для доставки и покраски, которые пользователь вводит. Немного помогите, прежде чем я полностью уйду из головы ... Спасибо.

circle.h

class circleType 
{ 
public: 
static void setRadius(double r); 

double getRadius(); 
double area(); 
double circumference(); 

circleType(double r = 0); 

private: 
double radius; 

}; 

void circleType::setRadius(double r) 
{ 
if (r >= 0) 
{ 
    radius = r; 
} 
else 
{ 
    radius = 0; 
} 
} 

double circleType::getRadius() 
{ 
return radius; 
} 

double circleType::area() 
{ 
return 3.1416 * radius * radius; 
} 

double circleType::circumference() 
{ 
return 2 * 3.1416 * radius; 
} 

circleType::circleType(double r) 
{ 
setRadius(r); 
} 

cylinderTyper.h

#include "circleType.h" 

class cylinderType: public circleType 
{ 
public: 
static void setRadius(double r); 

static double getRadius(); 
static double area(); 
static double circumference(); 

cylinderType(double r = 0); 

private: 

double radius; 

}; 

main.cpp

#include "stdafx.h" 
#include "cylinderType.h" 
#include <iostream> 
#include <iomanip> 
#include <string> 

using namespace std; 

void enterData(int& cylinderBase,int& cylinerHeight, double& shipCost,  double& paintCost); 

int main() 
{ 
cout << fixed << showpoint << setprecision(2); 

int cylinderBase, cylinderHeight; 
double sCost, pCost, shipCost, paintCost, volume, area = 0, circumference = 0; 

enterData(cylinderBase, cylinderHeight, shipCost, paintCost); 

cylinderType::setRadius(cylinderBase + cylinderHeight); 
cylinderType::getRadius(); 
cylinderType::area(); 
cylinderType::circumference(); 

cout << "Cost of shipping: $" << circumference * shipCost << endl; 

cout << "Cost of painting: $" << area * paintCost << endl; 

system("pause"); 
return 0; 
} 

void enterData(int& cylinderBase, int& cylinderHeight, double& shipCost, double& paintCost) 
{ 
cout << "Enter the base size of cylinder: "; 
cin >> cylinderBase; 
cout << endl; 

cout << "Enter the hight size of cylinder: "; 
cin >> cylinderHeight; 
cout << endl; 

cout << "Enter shipping cost per liter: "; 
cin >> shipCost; 
cout << endl; 

cout << "Enter cost of painting per square foot: "; 
cin >> paintCost; 
cout << endl; 

} 
+1

У вас есть радиус в базовом классе, а также в производном классе: Я подозреваю, что это проблема – rts1

+2

Метод setRadius не должен быть статическим. –

+1

Не должно быть никакой функции 'cylinderType :: setRadius', так как правильная версия уже унаследована от базового класса. Цилиндр просто должен выполнять обработку высоты и вычислять общую площадь всех поверхностей (две грани, равные площади поверхности, и одна криволинейная поверхность, которая как-то может быть связана с окружной окружностью). –

ответ

0

Это очень простое правило: статические функции-члены могут только переменные члены доступа, которые являются статично. Это связано с тем, что статическая функция не вызывается против определенного объекта, поэтому члены объекта не имеют смысла в этом контексте.

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

+0

Спасибо всем за ваш вклад. Я попробовал предложения, но в итоге получил аналогичную ошибку. Ошибка 1 ошибка C2352: 'circleType :: setRadius': незаконный вызов нестатической функции-члена Это моя дилемма. Я получаю одну или другую ошибку. Строка 26 в main.cpp вызывает ошибку: cylinderType :: setRadius (cylinderBase + cylinderHeight); Я пробовал некоторые другие варианты, но получил одну из этих двух ошибок или получил ошибку внешней ссылки. – Raj

+0

Статические функции @Raj предназначены для вызова с использованием синтаксиса 'class ::', в то время как нестатические функции предназначены для вызова с помощью 'object.' или' pointer-> 'синтаксиса. Вам нужно создать объект класса, прежде чем вы вызовете нестатический элемент. –

Смежные вопросы