C++ 错误:'.' 之前的预期主表达式 令牌

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/8496775/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-28 18:40:45  来源:igfitidea点击:

error: expected primary-expression before '.' token

c++qtclassobjectmember-functions

提问by Wylie Coyote SG.

I am currently teaching myself C++ using A C++ for Dummies All-In-One; second edition. TO create this program I am using Qt. I understand it to be a good practice to organize objects and classes in your header files and prospectively your member functions in a .cpp file built in addition to the main.cpp. In this regard I try to run the exercises in this book as such but just recently encountered the following error.

我目前正在使用 A C++ for Dummies All-In-One 自学 C++;第二版。为了创建这个程序,我使用 Qt。我认为在头文件中组织对象和类是一种很好的做法,并且在 main.cpp 之外构建的 .cpp 文件中组织成员函数。在这方面,我尝试运行本书中的练习,但最近遇到了以下错误。

expected primary-expression before '.' token

This error occurs on Lines 31, 32, and 37 so they appear to be relevant to my class member functions specifically.

此错误发生在第 31、32 和 37 行,因此它们似乎与我的类成员函数特别相关。

My main.cpp

我的主.cpp

#include "controlinginput.h"
#include <QtCore/QCoreApplication>
#include <iostream>
#include <sstream>


using namespace std;

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);


// just a basic name-entering
string name;
cout << "What is your name?";
cin >> name;
cout << "Hello " << name << endl;

/* now you are asked for a number
  but the computer will allow you to enter anything*/
int x;
cout << endl << "Enter a number! Any Number!" << endl;
cin >> x;
cout << "You choose " << x << endl;

/* now youll be asked for a number again
  but the computer will only allow numbers */
cout << endl<< "This time you will ONLY be able to enter a number! " << endl;
cout << "SO, Pick a number! any number!" << endl;
string entered = ControlingInput.enterOnlyNumbers(); // ###Error###        
int num = ControlingInput.stringToANumber(entered); // ###Error###
cout << endl << "You entered " << num << endl; // value is displayed
//Now finally we enter the password
cout << endl;
cout << "Please enter a password" << endl;
string password = ControlingInput.EnterPassword(); // ###Error###
cout << "shh... your password is " << password << endl;
return a.exec();
}

I did some research to find that this error indicates a pretty broad range of misuse of syntax. Unfortunately I was unable to find an instance that resembled mine specifically; I was hoping to get some insight from some of the more experienced programmers. If this is a simple issue that is on account of negligence on my end I apologize in advance and appreciate the feedback. I learn better if it gave me allot of trouble as opposed to a little..

我做了一些研究,发现这个错误表明语法滥用的范围相当广泛。不幸的是,我无法找到一个特别像我的实例;我希望能从一些更有经验的程序员那里得到一些见解。如果这是一个简单的问题,因为我的疏忽,我提前道歉并感谢反馈。如果它给我带来了很多麻烦而不是一点点,我就会学得更好。

Because these include my member functions I have also included my header file and .cpp

因为这些包含我的成员函数,所以我还包含了我的头文件和 .cpp

controlingInput.cpp (I have included my header file and iostreamand sstreamhere but for some reason the editor was giving me problems on here)

controlingInput.cpp(我已经包括了我的头文件,iostreamsstream在这里,但由于某些原因,编辑正在给我放在这里的问题)

using namespace std;

ControlingInput::ControlingInput()
{

}
int ControlingInput::stringToANumber(string MyString)
{
istringstream converter(MyString); //Holds the string that was passed to this function
int result;                        //Holds the integer result

//perform the conversion
converter >> result;
return result; //function completes and returns converted string

}

string ControlingInput::enterOnlyNumbers()
{
string numbAsString = ""; // this holds our numeric string
        char ch = getch();  // This gets a single character from our user
//Says to keep gettting characters from our user untill user presses enter
        while (ch != '\r') // \r is the enter key
        {
           //This says to add characters only if they are numbers
            if (ch >= '0' && ch <='9')
            {
                cout << ch; // show
                numbAsString += ch; // add character to the string
            }

            ch = getch(); // get the next character from the user

        }
        return numbAsString;

}

string ControlingInput::EnterPassword()
{
string numbAsString = ""; //this will hold our password string
char ch = getch(); // this gets a single char from our users just like before
//keep gettting characters from the user until enter/return is pressed
while (ch != '\r'); // \r is the enter or return key
{
    //for security passwords are displayed as asterisks instead of characters
    cout << '*';

    //add character input into the password string
    numbAsString += ch;

    //Get the next character from the user
    ch = getch();
}
return numbAsString; // return the user input from this function

And Here is my controlingInput.h

这是我的 controlingInput.h

#ifndef CONTROLINGINPUT_H
#define CONTROLINGINPUT_H
#include <iostream>

using namespace std;

class ControlingInput
{
public:
int stringToANumber(string MyString);
string EnterPassword();
string enterOnlyNumbers();

};

#endif // CONTROLINGINPUT_H

Thanks in advance for any feedback.

提前感谢您的任何反馈。

回答by Joe

You are attempting to call instance variables with the class itself as if they were static (which would still be invalid syntax). For this to work properly you need an instance of ControlingInput.

您正在尝试使用类本身调用实例变量,就好像它们是静态的一样(这仍然是无效的语法)。要使其正常工作,您需要一个ControlingInput.

int main(int argc, char *argv[])
{

    QCoreApplication a(argc, argv);

    ControlingInput ctrlInput; //Create instance
    ...

    string entered = ctrlInput.enterOnlyNumbers();        
    int num = ctrlInput.stringToANumber(entered);
    cout << endl << "You entered " << num << endl; // value is displayed
    ...

    string password = ctrlInput.EnterPassword();
    cout << "shh... your password is " << password << endl;
    return a.exec();

}