error: expected primary-expression before '.' token

25,582

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.

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

}
Share:
25,582
Wylie Coyote SG.
Author by

Wylie Coyote SG.

SE Student

Updated on December 14, 2020

Comments

  • Wylie Coyote SG.
    Wylie Coyote SG. over 3 years

    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.

    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.

    My main.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

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

    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

    #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.

  • Wylie Coyote SG.
    Wylie Coyote SG. over 12 years
    Ahh; Alright I understand! Its a good thing too because I had the wrong idea of creating an instance of an object. I Believed that because the object was included it was created. That worked like a charm. Thank you for your time.