# Writing a smart contract in C++

### Sample contract functionality

The sample contract serves as a demonstration of general QVM logic.

It is capable of:

* registering users into the database
* storing the last registered user's name in the database
* echoing the previous user's name to STDOUT
* incrementing the total registered user count
* storing above counter in the database

### Sample code

```cpp
#include <iostream>
#include <cstdlib>
#include <cstring>

using namespace std;

// Copied from C version
static int envAtoi(const char* env) {
    const char* val = getenv(env);
    if (val == NULL) {
        return 0;
    }
    return atoi(val);
}

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

    // THIS SAMPLE ONLY SUPPORTS THE "register" FUNCTION
    if (argc == 3 && strcmp(argv[1], "register") == 0) {

        // GET THE CURRENT USER'S NAME
        const char *previousName = getenv("DB_USER_CURRENT");

        // OR DEFAULT TO "unknown" IF THIS IS THE FIRST CALL
        if (previousName == NULL || strlen(previousName) == 0) {
            previousName = "unknown";
        }

        // GET THE TOTAL USER COUNT
        int totalUserCount = envAtoi("DB_TOTALUSERS");

        // WRITE PREVIOUS USER NAME TO STDOUT
        cout << "OUT=prevname: " << previousName << endl;

        // UPDATE CURRENT USER NAME BY WRITING IT TO DB
        cout << "DBW=USER_CURRENT=" << argv[2] << endl;

        // STORE USER NAME UNDER A STORAGE SLOT FOR PERSISTENCE (CURRENT GETS OVERWRITTEN ON EACH CALL)
        cout << "DBW=USER_" << totalUserCount << "=" << argv[2] << endl;

        // INCREMENT THE TOTAL USER COUNT
        cout << "DBW=TOTALUSERS=" << totalUserCount+1 << endl;
        return 0;
    }
    if (argc >= 2) {
        cerr << "Wrong CMD: " << argv[1] << endl;
        exit(1);
    }
    cerr << "Wrong args!" << endl;
    exit(1);
}
```

### Save the contract

Open a text editor and save above sample contract as `main.cpp` file.

{% content-ref url="compiling-a-smart-contract-in-c++" %}
[compiling-a-smart-contract-in-c++](https://learn.qanplatform.com/developers/qvm-multi-language-smart-contracts/docs-for-supported-languages/c++-smart-contract/compiling-a-smart-contract-in-c++)
{% endcontent-ref %}
