Wednesday, October 26, 2016

Getting good at: C++ | #7 - Objects and Classes

#7 - ricky reed is best gem

How's it goin bros, Virgil Rhino here. Today, we're gonna discuss classes. Classes are similar to int main because they both use curly braces. The difference is that classes don't require a set of parameters, and int main doesn't require access specifiers (public:, protected:, and private:). Keep in mind, however, that classes are not functions, but they can contain functions. Say for instance, you create a class. For this example, we're going to call it 'kek'. Our class is going to have the public access specifier:

class kek
{
public:
     
}

And it's here that we're going to create our function. We're going to create a void function, because unlike an int function, void returns nothing, so we don't have to type 'return 0;' at the end.

class kek
{
public:
     void dAnK()
          {
               cout << "kek" << endl;
          }
}

Functions inside of a class are called class member functions.

Now, we're going to use this class member function by creating an object. An object contains all the functions and variables contained on our class, which is how we can use that class member function. To make an object, go to int main() and type 'kek kekObj;', where 'kek' is our class name, and 'kekObj' is our object name. Below that, type 'kekObj.dAnK();'. This tells our object to use the class member function, titled dAnK(), which outputs 'kek'. When you're done, your program should look like this:

class kek
{
public:
     void dAnK()
     {
          cout << "kek" << endl;
     }
}

int main()
{
     kek kekObj;
     kekObj.dAnK();
     return 0;
}

And your result should look like this:



This is how not to create a class. You don't make a class file without including private:, and you definitely don't use it to output text. That's a waste of a class file. I left this in here to help you avoid this.

To properly set up a class file, we first need to erase everything in our class and int main. It should look like this:

class kek
{
     
}

int main()
{
     return 0;
}

Now, we add our public and private access specifiers:

class kek
{
public:
     
private:
     
}

And inside the private: access specifier, we add a variable and set it equal to any value. For this example, I'm going to set it to 40:

class kek
{
     public:
     
     private:
     int dank = 40;
}

int main()
{
     return 0;
}

Now in our public: access specifier, we add what are called Accessors and Mutators. These are self-explanatory. Accessors and Mutators are both class member functions that deal with the integer (also called 'data members') in the private: access specifier. 
Mutators set the private: data member to something, and Accessors read from the private: data member. 

Mutators are typically void functions because they're supposed to set the private: data member to something and return nothing. Accessors are usually int functions because they're only supposed to return the private: data member. 

Something like this:

class kek
{
     public:
     void setDank(int x)
     {
          dank = x;
     }
     int getDank()
     {
          return dank;
     }
     private:
     int dank = 40;
}

int main()
{
     return 0;
}


And now we add our objects:

class kek
{
     public:
     void setDank(int x)
     {
          dank = x;
     }
     int getDank()
     {
          return dank;
     }
     private:
     int dank = 40;
}

int main()
{
     kek kekObj;
     cout << kekObj.getDank();
     return 0;
}

Note that you don't need to add cout <<, I'm just adding it as proof that our public: class member functions (Our 'getters and setters') did what they were supposed to. 

Your result should look like this:



That's all for this post. In the next tutorial, we'll be going over objects and classes. Until then....

Wednesday, September 28, 2016

Personal Post #4

no chin

So two days ago, I tried to host a Minecraft server. Tried. I got a domain name and linked my IP to it so people can connect to my server. On my side, I hosted the server on a port (25565) and forwarded it so it would redirect everyone to my local IP or in this case, my server. So it should work fine, right? Well, it redirected fine, but it said "Connection refused: no further information" which led me to believe my modem was blocking outside connections. I wasn't quite sure about that, because I looked and it didn't seem to be blocking anything, so I did a bit of research and found out that the Windows Firewall was the issue, so I disabled that and guess what? "Connection refused: no further information". So I decided to use my public IP instead. Still, "Connection refused: no further information." It wasn't until I used my local IP that it finally worked, leading me to believe that either a firewall is blocking outside connections, or I didn't configure the server properly. Either way, I won't release the domain name until I get the server running. Until then...

Friday, September 23, 2016

bad idea

delete your channel

The 8800 GTX was released in November 2006, and supports the DirectX 10 API. During its release, it was the single most powerful GPU NVidia has ever made at the time. Capable of outperforming the Radeon HD 2900 XT, the 7950 GX2, and TWO X1950s, the 8800 was no slouch. Now, more than 9 years after it's initial launch, it's still capable of running some AAA titles at reasonable framerates, which got me thinking: if it can run DX9/10 games well, could I daisy chain 3 of them together and Force WARP DX11 and get reasonable performance in other AAA titles? I would need a pretty hefty setup to support 3 8800 GTX cards, but I think it might just be possible. We'll see...

Thursday, September 22, 2016

Getting good at: C++ | #6 - If-Else Statements

6 - wake me up inside

How's it going everyone? No Chin here, and today we're going to talk about If-Else statements. Basically, an If-Else statement is a lot like a real world If Else statement. Something like: If something is true, then do something. Otherwise, don't do anything.

Unlike the other objects we used, the If statement uses its own set of curly-braces and parameters. Here's an example:

int main()
{
     int x;
     cin >> x;
     if(x==1)
     {
          cout << "WHy" << endl;
     }
     return 0;
}

The parameters have to be set to something with the If statement, so in this case, we told the If statement that x has to be equal to 1 in order for it to output something, and if x is not equal to 1, it can't output anything. However, we can still get it to output something even if x is not equal to 1, and that's where the Else statement comes in. Unlike the If statement, the Else statement doesn't require its own parameters. It's basically just a continuation of the If statement. For example:

int main()
{
     int x;
     cin >> x;
     if(x==1)
     {
          cout << "topkek" << endl;
     }
     else
     {
          cout << "get off my computer" << endl;
     }
     return 0;
}

Note that the "==" is intentional. One equal sign sets a variable, and two means that something is equal to another thing.

Now let's go back to our password program. Last time, we excluded the if-else statement, so the string could be set to anything and it would output the same result. Let's try it with the If-Else Statement:

int main()
{
     string harambe;
     cin >> harambe;
     if (harambe=="harambe")
     {
          cout << "f" << endl;
     }
     else
     {
          cout << "get off my computer" << endl;
     }
     return 0;
}

You should see something like this if you got the password right (Top is password, bottom is output):



And something like this if you got the password wrong:



Keep in mind, this is a very basic password program so it has no method of keeping your personal documents safe.

That's all I have for now. Until then...

Wednesday, September 21, 2016

Personal Post #3

Personal Post #3

So two days ago, I got some cool stuff. And you know I love cool stuff. I got not one, but TWO graphics cards. For free.

The cards themselves aren't special; in fact, you might find them quite depressing. The one on the bottom is an ATI Radeon X1550 AGP (256 MB), and the one on top is a Radeon HD 2400 PCI (Also 256 MB). Someone lent these to me (I won't be disclosing their name for privacy reasons.) to use for testing, but the PC I was going to use was not with me as of Monday, so I just looked at them, admiring the poorly-rendered image on the heatsink. Interestingly enough, I actually have an HD 2400, but it has twice the vRAM as the other one, and it uses the AGP bus. I find it cool that I could use these, because for one, I love old computer stuff, and two, I don't usually see these for free, so this was a big surprise. Aside from that, I did some photoshopping.



BTW, it took me like 10 minutes to make that. That's all I have for now. Until then...

Getting good at: C++ | #5 - Strings

Stuff you don't care about

This blog has breached 100 views already. If it got that many views in the time it existed, you better believe I'm gonna shamelessly promote my channel.

5 - Bad Password Program

So today, we're going to be writing a program that takes advantage of strings. In case you don't know what a string is, it's basically an object, and with all objects comes classes. This particular object comes from the class <string>. How you would implement this class is by typing #include <string>. In fact, that's how you implement most classes, but more on that later. For now, let's write a terrible password program. To start, create your string, and set it to what you want. For example:

{
     string harambe;



}

Then use cin >> to allow the user to input the string, so in this case, 'harambe':

{
     string harambe;
     cin >> harambe;


}

Then, let's output some text; in this case, "personal information":

{
     string harambe;
     cin >> harambe;
     cout << "sub to control alt defeat" << endl;
     return 0;
}

After you compile it, you should see something like this:

Note that the top (harambe) is our input, and the bottom (f) is our output. Keep in mind this is a terrible password program, because you can type whatever you want and you'll get the exact same result, as shown here:



In case you're wondering, I used \n to space the input and output so it would be easier to explain.

I'll show you how to change that in the next post. Until then...






Monday, September 19, 2016

Personal Post #2

Roight into the neeewwwwwssss

So I've been using Windows 10 for the past 12 and a half months now, and let me just tell you: It's the most unfinished operating system I've seen in a long time. Performance issues, 3-5 hr battery life, problems interacting with hardware, Cortana, etc. And get this: A license of Windows 10 (With NO office suite/application bundle) costs $50-70. If you don't think that's bad, a standard install of Ubuntu (With a full office suite, compatible with Word/Excel/PowerPoint) costs...you know what? I'll let you guess...


Go ahead, I can wait.


Did you guess it? $130-$150? Nope. It's free. Yep. Office suite and all. Furthermore, it comes with drivers compatible with AMD/NVidia/Intel graphics cards. With the correct version of OpenGL. I kid you not. Do you think Microsoft provides these drivers out of the box. Nope. If you think you can get away with not installing any graphics drivers on your PC, Microsoft isn't gonna have it. You're stuck with OpenGL 1.1. Shoutout to anyone who remembers that from 1997. Also, the .iso for Ubuntu is significantly smaller than the Windows .iso. But back to the drivers; I understand that the drivers on Linux are freeware, and incompatible with NT (Win 2000/XP/7/8/8.1/10), but it's something I personally can't stand. Anyway, if you want the .iso for Ubuntu, click here. To use it, burn it to a flash drive. Imaging software includes: Rufus, UNetbootin, Universal USB Installer, etc. If you prefer your installer on optical discs, you can use ImgBurn. If you want to retain your copy of Windows and run it, select "Run Ubuntu from this CD/USB", or Install Ubuntu alongside Windows Boot Manager (Assuming you're running Windows 10). If you use software compiled for Windows, press Ctrl+Alt+T, type

sudo dpkg --add-architecture i386

This will enable 32-bit architecture on a 64-bit system. Then, add the repository:

sudo add-apt-repository ppa:wine/wine-builds

Then update the packages:

sudo apt-get update

Then install:

sudo apt-get install --install-recommends winehq-devel

For the in-depth guide, click here. This method should work for Debian as well.

That's all I've got. Subscribe to Control Alt Defeat. Until then...