【问题标题】:Expected primary expression before '.''.' 之前的预期主要表达式
【发布时间】:2012-03-20 20:23:51
【问题描述】:
#include <iostream>
using std::cout;
using std::endl;

class square {

public:
    double length, width;
    
    square(double length, double width);
    square();
    
    ~square();
    
    double perimeter();
};

double square::perimeter() {
return 2*square.length + 2*square.width;
}

int main() {

square sq(4.0, 4.0);

cout << sq.perimeter() << endl;

return 0;
}

我正在尝试编写一个简单的类程序。我收到了错误

in member function 'double square::perimeter()';
.cpp:21: error: expected primary-expression before '.' token
.cpp:21: error: expected primary-expression before '.' token

这是否意味着我必须使用2*square::length + 2*square::width

【问题讨论】:

  • 为什么一个正方形会有不同的lengthwidth?你可以使用side

标签: c++ class


【解决方案1】:

square 是一个类型,而不是一个对象;而不是

return 2*square.length + 2*square.width;

return 2*length + 2*width;

(隐含地等同于:

return 2*this->length + 2*this->width;

为了清楚起见,您可能喜欢,或者 可能不喜欢)。

如果lengthwidth 是,则2*square::length + 2*square::width 将是有效的语法

  • 静态 square 的成员,或
  • 某些基类square 的成员,或
  • 某些命名空间中的对象square

【讨论】:

    【解决方案2】:

    是的,准确的形式是:

    return 2*square::length + 2*square::width;
    

    因为square 是一个类型,而不是一个对象。

    在这种情况下,它与以下内容相同:

    return 2*this->square::length + 2*this->square::width;
    

    但是,由于它是 same 对象和 same 类型,您可以只写:

    return 2*this->length + 2*this->width;
    

    或者,最简单的:

    return 2*length + 2*width;
    

    【讨论】:

      【解决方案3】:

      简单使用

      double square::perimeter() {
          return 2 * length + 2 * width;
      }
      

      【讨论】:

        【解决方案4】:
        double square::perimeter() {
            return 2*square.length + 2*square.width;
        }
        

        您需要说square::perimeter(),因为您正在定义 square 类本身的方法。您似乎想在特定对象上定义它,但您希望它可用于所有 square 实例,因此您需要在特定对象上定义它。

        另一方面,实例变量lengthwidth 与类的特定实例相关,而不是整个类本身(否则您将它们声明为static)。这意味着您可以直接引用它们而不是通过类本身,编译器将知道您在谈论什么变量。这是因为widthlength 被定义在与方法相同的范围内,所以你不需要用:: 给它特殊的方向来告诉它在哪里可以找到它要查找的内容。因此:

        double square::perimeter() {
            return 2 * length + 2 * width; //will refer to the instance variables automatically
        }
        

        【讨论】:

          【解决方案5】:

          要访问实例变量,只需命名它们:

          double square::perimeter() {
            return 2*length + 2*width;
          }
          

          【讨论】:

            【解决方案6】:
            double square::perimeter() {
            return 2*square.length + 2*square.width;
            }
            

            这个函数中的square 是什么? square 是一个类。您使用. 运算符来访问对象中的成员。喜欢sq.somefun();

            所以你的外围功能应该是:

             double square::perimeter() {
                return (2*(length + width));
                }
            

            但是正方形的长宽不相等吗?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-07-26
              • 1970-01-01
              • 2018-11-27
              • 2020-01-16
              相关资源
              最近更新 更多